The relative benefits of environmental enrichment on learning and memory are greater when stressed: a meta-analysis of interactions in rodents

Supplementary Material S3

Setting-up

Loading packages

# devtools::install_github('Mikata-Project/ggthemr', force = TRUE)

pacman::p_load(tidyverse, here, metafor, clubSandwich, orchaRd, MuMIn, patchwork,
    GoodmanKruskal, networkD3, ggplot2, ggsignif, visdat, ggalluvial, ggthemr, cowplot,
    grDevices, png, grid, gridGraphics, pander, formatR)
# needed for model selection using MuMIn within metafor
eval(metafor:::.MuMIn)

Loading data and functions

This loads the unprocessed data file and custom functions including

  • calculating ‘focal’ effect sizes and variance for lnRR and SMD: effect_set
  • calculating ‘pairwise’ comparisons (lnRR) and variance: effect_set2
  • calculating pair-wise contrasts between moderators: contrast_fun
dat <- read_csv(here("Data", "Data_raw.csv"))
# Load custom function to extract data
source(here("R/Functions.R"))

Data organisation

  • removing study (Wang et al_2020) with negative values as lnRR cannot be calculated with negative values
  • rounding down sample sizes that are reported as decimals due to averaging n across treatments
  • getting effect sizes from function
  • ‘flipping’ effect sizes so that all effect sizes are higher values = individuals do better in cognitive assays
  • assigning human readable terms, and creating VCV of variance
# removing study with negative values as these are unable to be used for lnRR
dat <- droplevels(dat[!dat$First_author == "Wang", ])

# rounding down sample sizes
dat$CC_n <- floor(dat$CC_n)
dat$EC_n <- floor(dat$EC_n)
dat$CS_n <- floor(dat$CS_n)
dat$ES_n <- floor(dat$CS_n)

# 'Focal' effect_size
effect_size <- with(dat, mapply(effect_set, CC_n, CC_mean, CC_SD, EC_n, EC_mean,
    EC_SD, CS_n, CS_mean, CS_SD, ES_n, ES_mean, ES_SD, percent = Response_percent,
    SIMPLIFY = FALSE))
effect_size <- map_dfr(effect_size, I)

# 'Pairwise' effect size
effect_size2 <- with(dat, mapply(effect_set2, CC_n, CC_mean, CC_SD, EC_n, EC_mean,
    EC_SD, CS_n, CS_mean, CS_SD, ES_n, ES_mean, ES_SD, percent = Response_percent,
    SIMPLIFY = FALSE))
effect_size2 <- map_dfr(effect_size2, I)

full_info <- which(complete.cases(effect_size) == TRUE)

# adding effect sizes as column
dat <- bind_cols(dat, effect_size, effect_size2)
dat <- dat[full_info, ]

# Flipping 'lower is better' to 'higher is better' effect sizes flipping lnRR
# for values where higher = worse
dat$lnRR_Ea <- ifelse(dat$Response_direction == 2, dat$lnRR_E * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$lnRR_E))
# currently NAswhich causes error
dat$lnRR_Sa <- ifelse(dat$Response_direction == 2, dat$lnRR_S * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$lnRR_S))  # currently NAswhich causes error
dat$lnRR_ESa <- ifelse(dat$Response_direction == 2, dat$lnRR_ES * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$lnRR_ES))  # currently NAswhich causes error
# flipping 'pure effect sizes'
dat$lnRR_E2a <- ifelse(dat$Response_direction == 2, dat$lnRR_E2 * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$lnRR_E2))  # currently NAswhich causes error
dat$lnRR_S2a <- ifelse(dat$Response_direction == 2, dat$lnRR_S2 * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$lnRR_S2))  # currently NAswhich causes error
dat$lnRR_ES2a <- ifelse(dat$Response_direction == 2, dat$lnRR_ES2 * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$lnRR_ES2))  # currently NAswhich causes error
dat$lnRR_E3a <- ifelse(dat$Response_direction == 2, dat$lnRR_E3 * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$lnRR_E3))  # currently NAswhich causes error
dat$lnRR_S3a <- ifelse(dat$Response_direction == 2, dat$lnRR_S3 * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$lnRR_S3))  # currently NAswhich causes error

# flipping SMD
dat$SMD_Ea <- ifelse(dat$Response_direction == 2, dat$SMD_E * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$SMD_E))  # currently NAswhich causes error
dat$SMD_Sa <- ifelse(dat$Response_direction == 2, dat$SMD_S * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$SMD_S))  # currently NAswhich causes error
dat$SMD_ESa <- ifelse(dat$Response_direction == 2, dat$SMD_ES * -1, ifelse(is.na(dat$Response_direction) ==
    TRUE, NA, dat$SMD_ES))

# assigning human readable terms
dat <- dat %>%
    mutate(Type_assay = case_when(Type_assay == 1 ~ "Habituation", Type_assay ==
        2 ~ "Conditioning", Type_assay == 3 ~ "Recognition", Type_assay == 4 ~ "Unclear"),
        Learning_vs_memory = case_when(Learning_vs_memory == 1 ~ "Learning", Learning_vs_memory ==
            2 ~ "Memory", Learning_vs_memory == 3 ~ "Habituation"), Type_reinforcement = case_when(Type_reinforcement ==
            1 ~ "Appetitive", Type_reinforcement == 2 ~ "Aversive", Type_reinforcement ==
            3 ~ "Not applicable", Type_reinforcement == 4 ~ "Unclear"), Type_stress_exposure = case_when(Type_stress_exposure ==
            1 ~ "Density", Type_stress_exposure == 2 ~ "Scent", Type_stress_exposure ==
            3 ~ "Shock", Type_stress_exposure == 4 ~ "Exertion", Type_stress_exposure ==
            5 ~ "Restraint", Type_stress_exposure == 6 ~ "MS", Type_stress_exposure ==
            7 ~ "Circadian rhythm", Type_stress_exposure == 8 ~ "Noise", Type_stress_exposure ==
            9 ~ "Other", Type_stress_exposure == 10 ~ "Combination", Type_stress_exposure ==
            11 ~ "unclear"), Age_stress_exposure = case_when(Age_stress_exposure ==
            1 ~ "Prenatal", Age_stress_exposure == 2 ~ "Early postnatal", Age_stress_exposure ==
            3 ~ "Adolescent", Age_stress_exposure == 4 ~ "Adult", Age_stress_exposure ==
            5 ~ "Unclear"), Stress_duration = case_when(Stress_duration == 1 ~ "Acute",
            Stress_duration == 2 ~ "Chronic", Stress_duration == 3 ~ "Intermittent",
            Stress_duration == 4 ~ "Unclear"), EE_social = case_when(EE_social ==
            1 ~ "Social", EE_social == 2 ~ "Non-social", EE_social == 3 ~ "Unclear"),
        EE_exercise = case_when(EE_exercise == 1 ~ "Exercise", EE_exercise == 2 ~
            "No exercise"), Age_EE_exposure = case_when(Age_EE_exposure == 1 ~ "Prenatal",
            Age_EE_exposure == 2 ~ "Early postnatal", Age_EE_exposure == 3 ~ "Adolescent",
            Age_EE_exposure == 4 ~ "Adult", Age_EE_exposure == 5 ~ "Unclear"), Exposure_order = case_when(Exposure_order ==
            1 ~ "Stress first", Exposure_order == 2 ~ "Enrichment first", Exposure_order ==
            3 ~ "Concurrently", Exposure_order == 4 ~ "Unclear"), Age_assay = case_when(Age_assay ==
            1 ~ "Early postnatal", Age_assay == 2 ~ "Adolescent", Age_assay == 3 ~
            "Adult", Age_assay == 4 ~ "Unclear"), Sex = case_when(Sex == 1 ~ "Female",
            Sex == 2 ~ "Male", Sex == 3 ~ "Mixed", Sex == 4 ~ "Unclear"), Type_EE_exposure = case_when(Type_EE_exposure ==
            1 ~ "Nesting material", Type_EE_exposure == 2 ~ "Objects", Type_EE_exposure ==
            3 ~ "Cage complexity", Type_EE_exposure == 4 ~ "Wheel/trademill", Type_EE_exposure ==
            5 ~ "Combination", Type_EE_exposure == 6 ~ "Other", Type_EE_exposure ==
            7 ~ "Unclear"), ROB_blinding = case_when(ROB_blinding == 1 ~ "Yes", ROB_blinding ==
            2 ~ "No", ROB_blinding == 3 ~ "Unclear"), ROB_randomisation = case_when(ROB_randomisation ==
            1 ~ "Yes", ROB_randomisation == 2 ~ "No", ROB_randomisation == 3 ~ "Unclear"))

# making variance VCVs
VCV_E <- impute_covariance_matrix(vi = dat$lnRRV_E, cluster = dat$Study_ID, r = 0.5)
VCV_S <- impute_covariance_matrix(vi = dat$lnRRV_S, cluster = dat$Study_ID, r = 0.5)
VCV_ES <- impute_covariance_matrix(vi = dat$lnRRV_ES, cluster = dat$Study_ID, r = 0.5)

VCV_Ea <- impute_covariance_matrix(vi = dat$SMDV_E, cluster = dat$Study_ID, r = 0.5)
VCV_Sa <- impute_covariance_matrix(vi = dat$SMDV_S, cluster = dat$Study_ID, r = 0.5)
VCV_ESa <- impute_covariance_matrix(vi = dat$SMDV_ES, cluster = dat$Study_ID, r = 0.5)

# write.csv(dat, file = here('Data', 'Data_processed.csv'), row.names = TRUE)

Data exploration

General

Number of effect sizes:

# Number of effect sizes
length(unique(dat$ES_ID))
## [1] 92

Number of studies:

length(unique(dat$Study_ID))
## [1] 30

Publication year range:

min(dat$Year_published)
## [1] 2006
max(dat$Year_published)
## [1] 2021

Visual of missing data

plot_missing <- vis_miss(dat) + theme(plot.title = element_text(hjust = 0.5, vjust = 3),
    plot.margin = margin(t = 0.5, r = 3, b = 1, l = 1, unit = "cm")) + ggtitle("Missing data in the selected predictors")  #no missing values

plot_missing

# useGoodman and Kruskal’s τ measure of association between categorical
# predictor variables (function from package GoodmanKruskal:
# https://cran.r-project.org/web/packages/GoodmanKruskal/vignettes/GoodmanKruskal.html)
# GKmatrix <- GKtauDataframe(subset(dat, select = c('Sex', 'Type_assay',
# 'Learning_vs_memory', #'Type_reinforcement', 'Type_stress_exposure',
# 'Age_stress_exposure', 'Stress_duration', #'EE_social_HR', 'EE_exercise',
# 'Age_EE_exposure', 'Exposure_order', 'Age_assay'))) plot(GKmatrix)

# simple pairwise contingency tables table(dat$Type_assay,
# dat$Type_reinforcement) table(dat$Age_stress_exposure, dat$Age_EE_exposure)
# table(dat$Type_stress_exposure, dat$Age_stress_exposure)
# table(dat$Type_stress_exposure, dat$Age_assay)
# table(dat$Type_stress_exposure, dat$Stress_duration)

Visual of missing data for each column. Note that most missing data are for different descriptive statistics as papers are often report results using different types of descriptive statistics (i.e., SD, SE, mean, median etc). Cannot reduce text size in this figure

Alluvial diagrams

Shows the relationship/nestedness of different data elements (used to produce Fig. 2)

Subjects info: species-strain-sex

freq_A <- as.data.frame(table(dat$Sex, dat$Common_species, dat$Strain)) %>%
    rename(Sex = Var1, Species = Var2, Strain = Var3)  #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_A), axes = 1:3, silent = TRUE)

p1 <- ggplot(data = freq_A, aes(axis1 = Sex, axis2 = Species, axis3 = Strain, y = Freq)) +
    geom_alluvium(aes(fill = Sex)) + geom_flow() + geom_stratum(aes(fill = Sex)) +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + geom_text(stat
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + "stratum",
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + aes(label
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + after_stat(stratum)))
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + #theme_minimal()
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
theme_void() + theme(legend.position = "none", plot.title = element_text(hjust = 0,
    vjust = 3), axis.title.x = element_text(), axis.text.x = element_text(face = "bold"),
    plot.margin = unit(c(1, 1, 0, 1), "cm")) + scale_x_discrete(limits = c("Sex",
    "Species", "Strain"), expand = c(0.15, 0.05), position = "top") + ggtitle("A  study subjects")

p1

Fig. 2a Relationship/nestedness between study species, strain of rodent, and sex

Environmental enrichment info: age-exercise-social EE

freq_B <- as.data.frame(table(dat$Age_EE_exposure, dat$EE_exercise, dat$EE_social)) %>%
    rename(Age_EE_exposure = Var1, EE_exercise = Var2, EE_social = Var3)  #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_B), axes = 1:3, silent = TRUE)

p2 <- ggplot(data = freq_B, aes(axis1 = Age_EE_exposure, axis2 = EE_exercise, axis3 = EE_social,
    y = Freq)) + geom_alluvium(aes(fill = Age_EE_exposure)) + geom_flow() + geom_stratum(aes(fill = Age_EE_exposure)) +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + geom_text(stat
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + "stratum",
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + aes(label
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + after_stat(stratum)))
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + #theme_minimal()
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
theme_void() + theme(legend.position = "none", plot.title = element_text(hjust = 0,
    vjust = 3), axis.title.x = element_text(), axis.text.x = element_text(face = "bold"),
    plot.margin = unit(c(1, 1, 0, 1), "cm")) + scale_x_discrete(limits = c("Age",
    "Exercise", "Social"), expand = c(0.1, 0.1), position = "top") + ggtitle("B  environmental enrichment")

p2

Fig. 2b Relationship/nestedness between the age of enrichment exposure, if enrichment involved a manipulation of exercise and social environment

Stress info: age-duration-type stress

freq_C <- as.data.frame(table(dat$Age_stress_exposure, dat$Stress_duration, dat$Type_stress_exposure)) %>%
    rename(Age_stress = Var1, Duration_stress = Var2, Type_stress = Var3)  #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_C), axes = 1:3, silent = TRUE)

p3 <- ggplot(data = freq_C, aes(axis1 = Age_stress, axis2 = Duration_stress, axis3 = Type_stress,
    y = Freq)) + geom_alluvium(aes(fill = Age_stress)) + geom_flow() + geom_stratum(aes(fill = Age_stress)) +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + geom_text(stat
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + "stratum",
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + aes(label
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + after_stat(stratum)))
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + #theme_minimal()
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
theme_void() + theme(legend.position = "none", plot.title = element_text(hjust = 0,
    vjust = 3), axis.title.x = element_text(), axis.text.x = element_text(face = "bold"),
    plot.margin = unit(c(1, 1, 0, 1), "cm")) + scale_x_discrete(limits = c("Age",
    "Duration", "Type"), expand = c(0.1, 0.1), position = "top") + ggtitle("C  stress exposure")

p3

Fig. 2c Relationship/nestedess between the age of stress exposure, the duration of the stres, and the type of stress

Assay info: LvsM-type-reinforcement

freq_D <- as.data.frame(table(dat$Learning_vs_memory, dat$Type_assay, dat$Type_reinforcement)) %>%
    rename(Learning_Memory = Var1, Type = Var2, Reinforcement = Var3)  #make a data frame of frequencies for three selected variables
is_alluvia_form(as.data.frame(freq_D), axes = 1:3, silent = TRUE)

p4 <- ggplot(data = freq_D, aes(axis1 = Learning_Memory, axis2 = Type, axis3 = Reinforcement,
    y = Freq)) + geom_alluvium(aes(fill = Learning_Memory)) + geom_flow() + geom_stratum(aes(fill = Learning_Memory)) +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + geom_text(stat
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + "stratum",
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + aes(label
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + =
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + after_stat(stratum)))
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + #theme_minimal()
    geom_text(stat = "stratum", aes(label = after_stat(stratum))) + #theme_minimal() + +
theme_void() + theme(legend.position = "none", plot.title = element_text(hjust = 0,
    vjust = 3), axis.title.x = element_text(), axis.text.x = element_text(face = "bold"),
    plot.margin = unit(c(1, 1, 0, 1), "cm")) + scale_x_discrete(limits = c("Learning_Memory",
    "Type", "Reinforcement"), expand = c(0.1, 0.1), position = "top") + ggtitle("D  cognitive assay")

p4

Fig. 2d Relationship/nestedness between if the assay measured a learning or memory trait, the type of assay used, and the type of reinforcement used

Combined plot

# p1 + scale_fill_brewer(palette = 'Set3') #Pastel1

(p1 + scale_fill_brewer(palette = "Set3"))/(p2 + scale_fill_brewer(palette = "Set3"))/(p3 +
    scale_fill_brewer(palette = "Set3"))/(p4 + scale_fill_brewer(palette = "Set3")) +
    plot_layout(ncol = 1, heights = c(1, 1, 1, 1, 1))

# ggsave(file = './figs/Alluvial_diagrams_v2.pdf', width = 10, height = 12,
# units = 'cm', dpi = 300, scale = 2) #, device = cairo_pdf)

Fig. 2 The combined plot of all alluvial diagrams used to make Fig. 2 in the main text

Risk of Bias

Percent of studies that used randomisation:

dat %>%
    group_by(ROB_randomisation) %>%
    summarise(n = n_distinct(Study_ID))
## # A tibble: 2 x 2
##   ROB_randomisation     n
##   <chr>             <int>
## 1 Unclear              15
## 2 Yes                  15
15/30
## [1] 0.5

Percent of studies that used blinding:

# blinding
dat %>%
    group_by(ROB_blinding) %>%
    summarise(n = n_distinct(Study_ID))
## # A tibble: 2 x 2
##   ROB_blinding     n
##   <chr>        <int>
## 1 Unclear         24
## 2 Yes              6
6/30
## [1] 0.2

Modelling with lnRR

Main effect: environmental enrichment

Meta-analysis

To quantify differences in individual performance in cognitive assays with environmental enrichment, we used the logarithm of response ratio (lnRR) calculated as:

\[ \ln{\text{RR}_\text{EE}} = \ln\left( \frac{ M_\text{ES} + M_\text{EC}} {2} \right) - \ln\left( \frac {M_\text{CS} + M_\text{CC}} {2} \right) = \ln \left( {\frac {M_\text{ES} + M_\text{EC}} {M_\text{CS} + M_\text{CC}}} \right), \]

Variance was calculated as:

\[ \text{var}(\ln{\text{RR}_\text{EE}}) = \left( \frac{1} { M_\text{ES} + M_\text{EC} } \right)^2 \left( \frac{SD_\text{ES}^2}{N_\text{ES}} + \frac{SD_\text{EC}^2}{N_\text{EC}} \right) + \left( \frac {1} { M_\text{CS} + M_\text{CC} } \right)^2 \left(\frac{SD_\text{CS}^2}{N_\text{CS}} + \frac{SD_\text{CC}^2}{n_\text{CC}} \right) \] Variance was converted in to variance-covariance (VCV) matrix (see above in ‘Data organisation’) to control for non-independence in sampling variance from the same studies.

#dat <- read_csv(here("Data","Data_processed.csv"))

mod_E0 <- rma.mv(yi = lnRR_Ea, V = VCV_E, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain),
                 test = "t",
                 data = dat)
summary(mod_E0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.7836   19.5672   27.5672   37.6106   28.0323   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0082  0.0905     30     no  Study_ID 
## sigma^2.2  0.0345  0.1858     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 809.2712, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1860  0.0320  5.8116  91  <.0001  0.1224  0.2496  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E0) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 9.310673e-01 1.786605e-01 7.524068e-01 6.097041e-10
orchard_plot(mod_E0, mod = "Int", xlab = "lnRR", alpha=0.4) +  # Orchard plot 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5)+ # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2)+ # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_colour_manual(values = "darkorange")+ # change colours
  scale_fill_manual(values="darkorange")+ 
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Fig. 3 Orchard plot showing meta-analytic mean and 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Meta-regression: uni-moderator

To explain some of the unexplained variation in the main effect of environmental enrichment model, we conducted a series of uni-moderator analyses. We calculated marginal R2 for each moderator as well as conducted a series of pair-wise contrasts between in moderator category.

Any moderator categories with k < 5 were removed.

Learning vs Memory

Was the response learning or memory?

mod_E1 <-  rma.mv(yi = lnRR_Ea, V = VCV_E, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID,
                                                                                        ~1|ES_ID,
                                                                                        ~1|Strain),
                  test = "t",
                  data = dat)

summary(mod_E1) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.3793   18.7586   28.7586   41.2577   29.4729   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0076  0.0873     30     no  Study_ID 
## sigma^2.2  0.0340  0.1843     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 802.5794, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 18.2861, p-val < .0001
## 
## Model Results:
## 
##                             estimate      se    tval  df    pval   ci.lb 
## Learning_vs_memoryLearning    0.2303  0.0450  5.1227  90  <.0001  0.1410 
## Learning_vs_memoryMemory      0.1624  0.0355  4.5713  90  <.0001  0.0919 
##                              ci.ub 
## Learning_vs_memoryLearning  0.3197  *** 
## Learning_vs_memoryMemory    0.2330  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E1) 
##   R2_marginal R2_coditional 
##    0.02572583    1.00000000
LvsM_E<- orchard_plot(mod_E1, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21) + # mean estimate
  scale_size_continuous(range = c(1, 7)) + # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

LvsM_E

Fig. 4a Orchard plot showing the group-wise means of the categorical variable ‘Learning_vs_memory’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_E1 <- contrast_fun(data = dat, response = lnRR_Ea, moderator = Learning_vs_memory,
    VCV = VCV_E)
res_table_mod_E1 <- get_estimate(model = mod_E1, contra = contra_mod_E1, moderator = Learning_vs_memory)

res_table_mod_E1
## # A tibble: 3 x 7
##   Levels          Estimate Lower_CI Upper_CI    P_value Lower_PI Upper_PI
##   <chr>              <dbl>    <dbl>    <dbl>      <dbl>    <dbl>    <dbl>
## 1 Learning          0.230    0.141    0.320  0.00000170   -0.185    0.645
## 2 Memory            0.162    0.0919   0.233  0.0000154    -0.249    0.574
## 3 Learning-Memory  -0.0679  -0.164    0.0284 0.165        -0.484    0.349

Type of assay

The broad category of the type of assay used to measure learning or memory

dat1 <- filter(dat, Type_assay %in% c("Recognition", "Habituation", "Conditioning"))
VCV_E1 <- impute_covariance_matrix(vi = dat1$lnRRV_E, cluster = dat$Study_ID, r = 0.5)

mod_E2 <- rma.mv(yi = lnRR_Ea, V = VCV_E1, mod = ~Type_assay-1, random = list(~1|Study_ID,
                                                                                  ~1|ES_ID,
                                                                                  ~1|Strain),
                 test = "t",
                 data = dat1)

summary(mod_E2)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.8496   15.6993   27.6993   42.6311   28.7237   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0099  0.0995     30     no  Study_ID 
## sigma^2.2  0.0321  0.1792     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 661.8903, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 12.7993, p-val < .0001
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval    ci.lb   ci.ub 
## Type_assayConditioning    0.2167  0.0351  6.1650  89  <.0001   0.1468  0.2865 
## Type_assayHabituation     0.1821  0.1147  1.5886  89  0.1157  -0.0457  0.4100 
## Type_assayRecognition     0.0554  0.0640  0.8659  89  0.3889  -0.0717  0.1826 
##  
## Type_assayConditioning  *** 
## Type_assayHabituation 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E2) 
##   R2_marginal R2_coditional 
##    0.07376134    1.00000000
Learning_E <- orchard_plot(mod_E2, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34", "grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
    geom_signif(comparisons = list(c("Conditioning", "Recognition")),
              annotations = "*") +
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Learning_E

Fig. 4b Orchard plot showing the group-wise means of the categorical variable ‘Type_assay’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparisons
contra_mod_E2 <- contrast_fun(data = dat1, response = lnRR_Ea, moderator = Type_assay,
    VCV = VCV_E1)
res_table_mod_E2 <- get_estimate(model = mod_E2, contra = contra_mod_E2, moderator = Type_assay)

res_table_mod_E2
## # A tibble: 6 x 7
##   Levels                Estimate Lower_CI Upper_CI     P_value Lower_PI Upper_PI
##   <chr>                    <dbl>    <dbl>    <dbl>       <dbl>    <dbl>    <dbl>
## 1 Conditioning            0.217    0.147    0.287      2.02e-8   -0.197    0.630
## 2 Habituation             0.182   -0.0457   0.410      1.16e-1   -0.285    0.649
## 3 Recognition             0.0554  -0.0717   0.183      3.89e-1   -0.371    0.482
## 4 Conditioning-Habitua…  -0.0345  -0.262    0.193      7.63e-1   -0.501    0.432
## 5 Conditioning-Recogni…  -0.161   -0.296   -0.0265     1.96e-2   -0.590    0.268
## 6 Habituation-Recognit…  -0.127   -0.381    0.127      3.24e-1   -0.607    0.353

Type of reinforcement

If conditioning was used, was aversive or appetitive reinforcement used?

dat2 <- filter(dat, Type_reinforcement %in% c("Appetitive", "Aversive", "Not applicable"))
VCV_E2 <- impute_covariance_matrix(vi = dat2$lnRRV_E, cluster = dat2$Study_ID, r = 0.5)
mod_E3 <- rma.mv(yi = lnRR_Ea, V = VCV_E2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                 test = "t",
                 data = dat2)

summary(mod_E3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.8702   15.7405   27.7405   42.6723   28.7649   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0109  0.1046     30     no  Study_ID 
## sigma^2.2  0.0319  0.1787     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 764.5984, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 12.4138, p-val < .0001
## 
## Model Results:
## 
##                                   estimate      se    tval  df    pval    ci.lb 
## Type_reinforcementAppetitive        0.2175  0.0726  2.9942  89  0.0036   0.0732 
## Type_reinforcementAversive          0.2191  0.0410  5.3456  89  <.0001   0.1377 
## Type_reinforcementNot applicable    0.0812  0.0560  1.4504  89  0.1505  -0.0300 
##                                    ci.ub 
## Type_reinforcementAppetitive      0.3618   ** 
## Type_reinforcementAversive        0.3006  *** 
## Type_reinforcementNot applicable  0.1924      
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E3) 
##   R2_marginal R2_coditional 
##    0.07720103    1.00000000
Reinforcement_E <-orchard_plot(mod_E3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34", "grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
    geom_signif(comparisons = list(c("Aversive", "Not applicable")),
              annotations = "*") +
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Reinforcement_E

Fig. 4c Orchard plot showing the group-wise means of the categorical variable ‘Type_reinforcement’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparisons
contra_mod_E3 <- contrast_fun(data = dat2, response = lnRR_Ea, moderator = Type_reinforcement,
    VCV = VCV_E2)
res_table_mod_E3 <- get_estimate(model = mod_E3, contra = contra_mod_E3, moderator = Type_reinforcement)

res_table_mod_E3
## # A tibble: 6 x 7
##   Levels                 Estimate Lower_CI Upper_CI    P_value Lower_PI Upper_PI
##   <chr>                     <dbl>    <dbl>    <dbl>      <dbl>    <dbl>    <dbl>
## 1 Appetitive              0.217     0.0732   0.362     3.56e-3   -0.218    0.653
## 2 Aversive                0.219     0.138    0.301     6.89e-7   -0.200    0.638
## 3 Not applicable          0.0812   -0.0300   0.192     1.50e-1   -0.345    0.507
## 4 Appetitive-Aversive     0.00164  -0.163    0.167     9.84e-1   -0.442    0.445
## 5 Appetitive-Not applic… -0.136    -0.315    0.0425    1.33e-1   -0.585    0.312
## 6 Aversive-Not applicab… -0.138    -0.259   -0.0172    2.56e-2   -0.567    0.291

Age of enrichment

The age when individuals were exposed to environmental enrichment

dat3 <- filter(dat, Age_EE_exposure %in% c("Adult", "Adolescent"))
VCV_E3 <- impute_covariance_matrix(vi = dat3$lnRRV_E, cluster = dat3$Study_ID, r = 0.5)


mod_E4 <- rma.mv(yi = lnRR_Ea, V = VCV_E3, mod = ~Age_EE_exposure-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat3)

summary(mod_E4) 
## 
## Multivariate Meta-Analysis Model (k = 88; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -6.9490   13.8980   23.8980   36.1698   24.6480   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0078  0.0885     29     no  Study_ID 
## sigma^2.2  0.0327  0.1808     88     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 86) = 782.6092, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 86) = 18.9060, p-val < .0001
## 
## Model Results:
## 
##                            estimate      se    tval  df    pval   ci.lb   ci.ub 
## Age_EE_exposureAdolescent    0.1799  0.0370  4.8553  86  <.0001  0.1062  0.2535 
## Age_EE_exposureAdult         0.2340  0.0620  3.7734  86  0.0003  0.1107  0.3573 
##  
## Age_EE_exposureAdolescent  *** 
## Age_EE_exposureAdult       *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E4) 
##   R2_marginal R2_coditional 
##    0.01127347    1.00000000
Age_E<- orchard_plot(mod_E4, mod = "Age_EE_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10))  

Age_E

Fig. 4d Orchard plot showing the group-wise means of the categorical variable ‘Age_EE_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparisons
contra_mod_E4 <- contrast_fun(data = dat3, response = lnRR_Ea, moderator = Age_EE_exposure,
    VCV = VCV_E3)
res_table_mod_E4 <- get_estimate(model = mod_E4, contra = contra_mod_E4, moderator = Age_EE_exposure)

res_table_mod_E4
## # A tibble: 3 x 7
##   Levels           Estimate Lower_CI Upper_CI    P_value Lower_PI Upper_PI
##   <chr>               <dbl>    <dbl>    <dbl>      <dbl>    <dbl>    <dbl>
## 1 Adolescent         0.180    0.106     0.254 0.00000533   -0.227    0.587
## 2 Adult              0.234    0.111     0.357 0.000295     -0.185    0.653
## 3 Adolescent-Adult   0.0541  -0.0895    0.198 0.456        -0.371    0.479

Exercise enrichment

Did enrichment involve the addition of apparatus for voluntary exercise (e.g., a wheel or treadmill)?

mod_E5<- rma.mv(yi = lnRR_Ea, V = VCV_E, mod = ~EE_exercise-1, random = list(~1|Study_ID,
                                                                               ~1|ES_ID,
                                                                               ~1|Strain),
                test = "t",
                data = dat)

summary(mod_E5)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -10.0303   20.0606   30.0606   42.5597   30.7749   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0096  0.0980     30     no  Study_ID 
## sigma^2.2  0.0345  0.1857     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 807.7169, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 16.1666, p-val < .0001
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval   ci.lb   ci.ub 
## EE_exerciseExercise       0.1849  0.0407  4.5464  90  <.0001  0.1041  0.2657 
## EE_exerciseNo exercise    0.1900  0.0556  3.4151  90  0.0010  0.0795  0.3005 
##  
## EE_exerciseExercise     *** 
## EE_exerciseNo exercise  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E5) 
##   R2_marginal R2_coditional 
##  0.0001360993  0.9999999987
Exercise_E <-orchard_plot(mod_E5, mod = "EE_exercise", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Exercise_E

Fig. 4d Orchard plot showing the group-wise means of the categorical variable ‘EE_exercise’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparisons
contra_mod_E5 <- contrast_fun(data = dat, response = lnRR_Ea, moderator = EE_exercise,
    VCV = VCV_E)
res_table_mod_E5 <- get_estimate(model = mod_E5, contra = contra_mod_E5, moderator = EE_exercise)

res_table_mod_E5
## # A tibble: 3 x 7
##   Levels               Estimate Lower_CI Upper_CI   P_value Lower_PI Upper_PI
##   <chr>                   <dbl>    <dbl>    <dbl>     <dbl>    <dbl>    <dbl>
## 1 Exercise              0.185     0.104     0.266 0.0000169   -0.240    0.610
## 2 No exercise           0.190     0.0795    0.301 0.000958    -0.241    0.621
## 3 Exercise-No exercise  0.00511  -0.132     0.142 0.941       -0.434    0.444

Social enrichment

Did enrichment involve more conspecifics (note that we did not include studies that only provided social enrichment but no other form of abiotic enrichment)?

dat4 <- filter(dat, EE_social %in% c("Social", "Non-social"))
VCV_E4 <- impute_covariance_matrix(vi = dat4$lnRRV_E, cluster = dat4$Study_ID, r = 0.5)
  
mod_E6<- rma.mv(yi = lnRR_Ea, V = VCV_E4, mod = ~EE_social-1, random = list(~1|Study_ID, 
                                                                             ~1|ES_ID,
                                                                             ~1|Strain),
                test = "t",data = dat4)

summary(mod_E6)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.3254   18.6507   28.6507   41.1498   29.3650   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0095  0.0974     30     no  Study_ID 
## sigma^2.2  0.0340  0.1844     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 801.5313, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 17.0110, p-val < .0001
## 
## Model Results:
## 
##                      estimate      se    tval  df    pval   ci.lb   ci.ub 
## EE_socialNon-social    0.1413  0.0498  2.8349  90  0.0057  0.0423  0.2403   ** 
## EE_socialSocial        0.2204  0.0432  5.0976  90  <.0001  0.1345  0.3063  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_E6) 
##   R2_marginal R2_coditional 
##    0.03377455    1.00000000
Social_E <-orchard_plot(mod_E6, mod = "EE_social", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  xlim(-0.5, 2) + 
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Social_E 

Fig. 4e Orchard plot showing the group-wise means of the categorical variable ‘EE_social’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Pairwise comparisons
contra_mod_E6 <- contrast_fun(data = dat4, response = lnRR_Ea, moderator = EE_social,
    VCV = VCV_E4)
res_table_mod_E6 <- get_estimate(model = mod_E5, contra = contra_mod_E6, moderator = EE_social)

res_table_mod_E6
## # A tibble: 3 x 7
##   Levels                   Estimate Lower_CI Upper_CI  P_value Lower_PI Upper_PI
##   <chr>                       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1 EE_exerciseExercise        0.185    0.104     0.266  1.69e-5   -0.240    0.610
## 2 EE_exerciseNo exercise     0.190    0.0795    0.301  9.58e-4   -0.241    0.621
## 3 EE_exerciseExercise-EE_…   0.0791  -0.0520    0.210  2.34e-1   -0.355    0.514

Publication bias & sensitivity analysis

Multi-moderator model

We ran a multi-moderator ‘full’ model of all moderators. We ran model selection based on AIC and selected the top set of models within delta AIC of 6 and calculated the importance of each moderator (i.e., Akaike weights) within this top model set.

# filter data so that all K < 5 are removed
dat_Efm <- dat %>%
    filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"), Type_reinforcement %in%
        c("Appetitive", "Aversive", "Not applicable"), EE_social %in% c("Social",
        "Non-social"), Age_EE_exposure %in% c("Adult", "Adolescent"))

# VCV_Efm <- impute_covariance_matrix(vi = dat_Efm$lnRRV_E, cluster =
# dat_Efm$Study_ID, r = 0.5)

mod_Efm <- rma.mv(yi = lnRR_Sa, V = VCV_Efm, mod = ~Type_assay - 1 + Learning_vs_memory +
    Type_reinforcement + EE_social + EE_exercise + Age_EE_exposure, random = list(~1 |
    Study_ID, ~1 | ES_ID, ~1 | Strain), test = "t", data = dat_Efm)
# summary(mod_Efm) r2_ml(mod_Efm)

res_Efm <- dredge(mod_Efm, trace = 2)
saveRDS(res_Efm, file = here("Rdata", "res_Efm.rds"))
# also saving the full model and data
saveRDS(mod_Efm, file = here("Rdata", "mod_Efm.rds"))
saveRDS(dat_Efm, file = here("Rdata", "dat_Efm.rds"))

The akaike weights for the top set of models with AIC < 6

dat_Efm <- readRDS(file = here("Rdata", "dat_Efm.rds"))
mod_Efm <- readRDS(file = here("Rdata", "mod_Efm.rds"))
res_Efm <- readRDS(file = here("Rdata", "res_Efm.rds"))
res_Efm2 <- subset(res_Efm, delta <= 6, recalc.weights = FALSE)
importance(res_Efm2)
##                      Age_EE_exposure Type_assay EE_exercise EE_social
## Sum of weights:      0.63            0.36       0.16        0.14     
## N containing models:   11              10          5           5     
##                      Learning_vs_memory Type_reinforcement
## Sum of weights:      0.10               0.07              
## N containing models:    4                  4

Funnel plot

We produced funnel plots of effect sizes against the residuals of the full model to visually inspect for funnel asymmetry

Used to produce Fig. 7a

# funnel plot
Funnel_E <- funnel(mod_Efm, xlab = "lnRR", ylab = "Standard Error")

# Funnel_E

Fig.7a Funnel plot showing the standard error and residuals (lnRR) from the full model.

Egger’s regression and time-lag bias

We fitted effective sample size calculated as:

\[ \sqrt{\frac {1} { \tilde{N} }} = \sqrt{\frac {1} { N_\text{ES}} + \frac{1}{N_\text{EC}} + \frac {1}{N_\text{CS}} + \frac{1}{N_\text{CC}}}, \]

and year of publication as moderators in the full model to inferentially test for funnel asymmetry and a decrease in effect sizes with publication year

VCV_Efm <- impute_covariance_matrix(vi = dat_Efm$lnRRV_E, cluster = dat_Efm$Study_ID,
    r = 0.5)
dat_Efm$c_Year_published <- as.vector(scale(dat_Efm$Year_published, scale = F))

dat_Efm$sqrt_inv_e_n <- with(dat_Efm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))

PB_MR_E <- rma.mv(lnRR_Sa, VCV_Efm, mods = ~1 + sqrt_inv_e_n + Learning_vs_memory +
    Year_published + Type_assay + Type_reinforcement + EE_social + EE_exercise +
    Age_stress_exposure, random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML",
    test = "t", data = dat_Efm)

# PB_MR_E

estimates_PB_MR_E <- estimates.CI(PB_MR_E)
estimates_PB_MR_E
##                              estimate        mean        lower       upper
## 1                             intrcpt -9.48981044 -50.89863818 31.91901730
## 2                        sqrt_inv_e_n -0.06281042  -0.86857733  0.74295650
## 3            Learning_vs_memoryMemory -0.06858190  -0.17753636  0.04037255
## 4                      Year_published  0.00467568  -0.01591231  0.02526367
## 5               Type_assayHabituation -0.55467640  -0.99644706 -0.11290575
## 6               Type_assayRecognition -0.11960483  -0.45315288  0.21394322
## 7          Type_reinforcementAversive  0.15536913  -0.15356140  0.46429965
## 8    Type_reinforcementNot applicable  0.32741009  -0.11084714  0.76566731
## 9                     EE_socialSocial  0.04883160  -0.16642221  0.26408540
## 10             EE_exerciseNo exercise -0.03983198  -0.28097488  0.20131093
## 11           Age_stress_exposureAdult -0.16033127  -0.54043113  0.21976858
## 12 Age_stress_exposureEarly postnatal -0.05978991  -0.45195630  0.33237649
## 13        Age_stress_exposurePrenatal -0.13988907  -0.53943086  0.25965272

Leave-one-out analysis

We individually removed studies to determine if any singular studies hve a disproportionate effect on the meta-analytic mean and CI.

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for (i in 1:length(levels(dat$Study_ID))) {

    d <- dat %>%
        filter(Study_ID != levels(dat$Study_ID)[i])

    VCV_Eb <- impute_covariance_matrix(vi = d$lnRRV_E, cluster = d$Study_ID, r = 0.5)

    LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_Ea, V = VCV_Eb, random = list(~1 |
        Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", data = dat[dat$Study_ID !=
        levels(dat$Study_ID)[i], ])
}

# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_E0) {
    df <- data.frame(est = mod_E0$b, lower = mod_E0$ci.lb, upper = mod_E0$ci.ub)
    return(df)
}


# using dplyr to form data frame
MA_CVR_E <- lapply(LeaveOneOut_effectsize, function(x) est.func(x)) %>%
    bind_rows %>%
    mutate(left_out = levels(dat$Study_ID))


saveRDS(MA_CVR_E, file = here("Rdata", "MA_CVR_E.rds"))

Used to produce Fig. S3

# telling ggplot to stop reordering factors
MA_CVR_E <- readRDS(file = here("Rdata", "MA_CVR_E.rds"))

MA_CVR_E$left_out <- as.factor(MA_CVR_E$left_out)
MA_CVR_E$left_out <- factor(MA_CVR_E$left_out, levels = MA_CVR_E$left_out)


# plotting
leaveoneout_E <- ggplot(MA_CVR_E) + geom_hline(yintercept = 0, lty = 2, lwd = 1) +
    geom_hline(yintercept = mod_E0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
    geom_hline(yintercept = mod_E0$b, lty = 1, lwd = 0.75, colour = "black") + geom_hline(yintercept = mod_E0$ci.ub,
    lty = 3, lwd = 0.75, colour = "black") + geom_pointrange(aes(x = left_out, y = est,
    ymin = lower, ymax = upper)) + xlab("Study left out") + ylab("lnRR, 95% CI") +
    coord_flip() + theme(panel.grid.minor = element_blank()) + theme_bw() + theme(panel.grid.major = element_blank()) +
    theme(panel.grid.minor.x = element_blank()) + theme(axis.text.y = element_text(size = 6))

leaveoneout_E

dat$Study_ID <- as.integer(dat$Study_ID)

Fig. S3 Leave-one-group-out analysis showing meta-analytic mean and 95% CI when each individual study is removed from the data set.

Using SMD

We re-ran the main effect of environmental enrichment meta-analytic model using standardised mean difference (SMD) instead of lnRR

mod_E0a <- rma.mv(yi = SMD_Ea, V = VCV_Ea, random = list(~1 | Study_ID, ~1 | ES_ID,
    ~1 | Strain), test = "t", data = dat)
summary(mod_E0a)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -111.6284   223.2568   231.2568   241.3003   231.7220   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.2512  0.5012     30     no  Study_ID 
## sigma^2.2  0.4247  0.6517     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 673.4722, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.7241  0.1295  5.5895  91  <.0001  0.4668  0.9814  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E0a)
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 8.673320e-01 3.223202e-01 5.450118e-01 1.749563e-09

Risk of Bias

Including if the study was randomised as a moderator and conducting a pair-wise contrast

mod_randomised_E <- rma.mv(yi = lnRR_Ea, V = VCV_E, mod = ~ROB_randomisation - 1,
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), test = "t", data = dat)

summary(mod_randomised_E)
r2_ml(mod_randomised_E)
contra_mod_randomised_E <- contrast_fun(data = dat, response = lnRR_Ea, moderator = ROB_randomisation,
    VCV = VCV_E)
res_table_mod_randomised_E <- get_estimate(model = mod_randomised_E, contra = contra_mod_randomised_E,
    moderator = ROB_randomisation)

res_table_mod_randomised_E
## # A tibble: 3 x 7
##   Levels      Estimate Lower_CI Upper_CI    P_value Lower_PI Upper_PI
##   <chr>          <dbl>    <dbl>    <dbl>      <dbl>    <dbl>    <dbl>
## 1 Unclear       0.140    0.0488    0.232 0.00304      -0.276    0.556
## 2 Yes           0.227    0.139     0.315 0.00000158   -0.188    0.642
## 3 Unclear-Yes   0.0868  -0.0352    0.209 0.161        -0.337    0.511

Including if the study used blinding and conducting a pair-wise contrast

mod_blinding_E <- rma.mv(yi = lnRR_Ea, V = VCV_E, mod = ~ROB_blinding - 1, random = list(~1 |
    Study_ID, ~1 | ES_ID, ~1 | Strain), test = "t", data = dat)

summary(mod_blinding_E)
r2_ml(mod_blinding_E)
contra_mod_blinding_E <- contrast_fun(data = dat, response = lnRR_Ea, moderator = ROB_blinding,
    VCV = VCV_E)
res_table_mod_blinding_E <- get_estimate(model = mod_blinding_E, contra = contra_mod_blinding_E,
    moderator = ROB_blinding)

res_table_mod_blinding_E
## # A tibble: 3 x 7
##   Levels      Estimate Lower_CI Upper_CI    P_value Lower_PI Upper_PI
##   <chr>          <dbl>    <dbl>    <dbl>      <dbl>    <dbl>    <dbl>
## 1 Unclear       0.198   0.122      0.274 0.00000131   -0.226    0.622
## 2 Yes           0.148   0.00811    0.288 0.0384       -0.292    0.588
## 3 Unclear-Yes  -0.0501 -0.208      0.108 0.530        -0.496    0.396

Main effect: stress

Meta-analysis

To quantify differences in individual performance in cognitive assays with stress, we used the logarithm of response ratio (lnRR) calculated as:

\[ \ln{\text{RR}_\text{stress}} = \ln\left( \frac{ M_\text{ES} + M_\text{CS}} {2} \right) - \ln\left( \frac {M_\text{EC} + M_\text{CC}} {2} \right) = \ln \left( {\frac {M_\text{ES} + M_\text{CS}} {M_\text{EC} + M_\text{CC}}} \right), \]

Variance was calculated as:

\[ \text{var}(\ln{\text{RR}_\text{stress}}) = \left( \frac{1} { M_\text{ES} + M_\text{CS} } \right)^2 \left( \frac{SD_\text{ES}^2}{N_\text{ES}} + \frac{SD_\text{CS}^2}{N_\text{CS}} \right) + \left( \frac {1} { M_\text{EC} + M_\text{CC} } \right)^2 \left(\frac{SD_\text{EC}^2}{N_\text{EC}} + \frac{SD_\text{CC}^2}{N_\text{CC}} \right) \] Variance was converted in to variance-covariance (VCV) matrix (see above in ‘Data organisation’) to control for non-independence in sampling variance from the same studies.

mod_S0 <- rma.mv(yi = lnRR_Sa, V = VCV_S, random = list(~1|Study_ID,
                                                          ~1|ES_ID,
                                                          ~1|Strain),
                 test = "t", 
                 data = dat)

summary(mod_S0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -14.1156   28.2312   36.2312   46.2747   36.6964   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0099  0.0993     30     no  Study_ID 
## sigma^2.2  0.0377  0.1941     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 946.9234, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.1052  0.0337  -3.1217  91  0.0024  -0.1721  -0.0383  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S0) 
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 9.376124e-01 1.946168e-01 7.429955e-01 1.975455e-10
orchard_plot(mod_S0, mod = "Int", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Fig. 3 Orchard plot showing meta-analytic mean and 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Meta-regression: uni-moderator

To explain some of the unexplained variation in the main effect of stress model, we conducted a series of uni-moderator analyses. We calculated marginal R2 for each moderator as well as conducted a series of pair-wise contrasts between in moderator category.

Any moderator categories with k < 5 were removed.

Learning vs Memory

Was the response learning or memory?

mod_S1 <-  rma.mv(yi = lnRR_Sa, V = VCV_S, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID,
                                                                                        ~1|ES_ID,
                                                                                        ~1|Strain),
                  test = "t",
                  data = dat)

summary(mod_S1) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -14.5281   29.0562   39.0562   51.5553   39.7705   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0094  0.0970     30     no  Study_ID 
## sigma^2.2  0.0388  0.1969     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 946.3930, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 5.0145, p-val = 0.0086
## 
## Model Results:
## 
##                             estimate      se     tval  df    pval    ci.lb 
## Learning_vs_memoryLearning   -0.1211  0.0476  -2.5423  90  0.0127  -0.2157 
## Learning_vs_memoryMemory     -0.0974  0.0380  -2.5648  90  0.0120  -0.1728 
##                               ci.ub 
## Learning_vs_memoryLearning  -0.0265  * 
## Learning_vs_memoryMemory    -0.0219  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S1) 
##   R2_marginal R2_coditional 
##   0.002776034   1.000000000
LvsM_S <- orchard_plot(mod_S1, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

LvsM_S 

Fig. 5a Orchard plot showing the group-wise means of the categorical variable ‘Learning_vs_memory’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_S1 <- contrast_fun(data = dat, response = lnRR_Sa, moderator = Learning_vs_memory,
    VCV = VCV_S)
res_table_mod_S1 <- get_estimate(model = mod_S1, contra = contra_mod_S1, moderator = Learning_vs_memory)

res_table_mod_S1
## # A tibble: 3 x 7
##   Levels          Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>              <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Learning         -0.121   -0.216   -0.0265  0.0127   -0.567    0.325
## 2 Memory           -0.0974  -0.173   -0.0219  0.0120   -0.540    0.345
## 3 Learning-Memory   0.0237  -0.0780   0.125   0.644    -0.424    0.472

Type of assay

The broad category of the type of assay used to measure learning or memory

dat$Type_assay<-as.factor(dat$Type_assay)

VCV_S1 <- impute_covariance_matrix(vi = dat1$lnRRV_S, cluster = dat$Study_ID, r = 0.5)


mod_S2 <- rma.mv(yi = lnRR_Sa, V = VCV_S1, mod = ~Type_assay-1, random =   list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat1)

summary(mod_S2)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -9.8028   19.6055   31.6055   46.5374   32.6299   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0161  0.1271     30     no  Study_ID 
## sigma^2.2  0.0279  0.1671     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 723.4973, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 6.7053, p-val = 0.0004
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb    ci.ub 
## Type_assayConditioning   -0.0981  0.0375  -2.6192  89  0.0104  -0.1725  -0.0237 
## Type_assayHabituation    -0.4615  0.1126  -4.0969  89  <.0001  -0.6853  -0.2377 
## Type_assayRecognition    -0.0534  0.0645  -0.8287  89  0.4095  -0.1816   0.0747 
##  
## Type_assayConditioning    * 
## Type_assayHabituation   *** 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S2) 
##   R2_marginal R2_coditional 
##     0.1853359     1.0000000
Learning_S <-orchard_plot(mod_S2, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
    geom_signif(comparisons = list(c("Habituation", "Recognition")),
              annotations = "***") +
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Learning_S

Fig. 5b Orchard plot showing the group-wise means of the categorical variable ‘Type_assay’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_S2 <- contrast_fun(data = dat1, response = lnRR_Sa, moderator = Type_assay,
    VCV = VCV_S1)
res_table_mod_S2 <- get_estimate(model = mod_S2, contra = contra_mod_S2, moderator = Type_assay)

res_table_mod_S2
## # A tibble: 6 x 7
##   Levels                   Estimate Lower_CI Upper_CI  P_value Lower_PI Upper_PI
##   <chr>                       <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1 Conditioning              -0.0981  -0.173   -0.0237  1.04e-2  -0.522    0.326 
## 2 Habituation               -0.461   -0.685   -0.238   9.21e-5  -0.935    0.0119
## 3 Recognition               -0.0534  -0.182    0.0747  4.10e-1  -0.490    0.383 
## 4 Conditioning-Habituation  -0.363   -0.584   -0.142   1.55e-3  -0.835    0.109 
## 5 Conditioning-Recognition   0.0447  -0.0882   0.177   5.06e-1  -0.393    0.482 
## 6 Habituation-Recognition    0.408    0.161    0.655   1.48e-3  -0.0768   0.893

Type of reinforcement

If conditioning was used, was aversive or appetitive reinforcement used?

VCV_S2 <- impute_covariance_matrix(vi = dat2$lnRRV_S, cluster = dat$Study_ID, r = 0.5)

mod_S3 <- rma.mv(yi = lnRR_Sa, V = VCV_S2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                 test = "t",
                 data = dat2)

summary(mod_S3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -13.8810   27.7621   39.7621   54.6939   40.7864   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0103  0.1016     30     no  Study_ID 
## sigma^2.2  0.0387  0.1966     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 920.8439, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.7942, p-val = 0.0130
## 
## Model Results:
## 
##                                   estimate      se     tval  df    pval 
## Type_reinforcementAppetitive       -0.1846  0.0749  -2.4649  89  0.0156 
## Type_reinforcementAversive         -0.0730  0.0427  -1.7081  89  0.0911 
## Type_reinforcementNot applicable   -0.1172  0.0590  -1.9851  89  0.0502 
##                                     ci.lb    ci.ub 
## Type_reinforcementAppetitive      -0.3334  -0.0358  * 
## Type_reinforcementAversive        -0.1579   0.0119  . 
## Type_reinforcementNot applicable  -0.2345   0.0001  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S3) 
##   R2_marginal R2_coditional 
##     0.0366428     1.0000000
Reinforcement_S <-orchard_plot(mod_S3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Reinforcement_S

Fig. 5c Orchard plot showing the group-wise means of the categorical variable ‘Type_reinforcement’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_S3 <- contrast_fun(data = dat2, response = lnRR_Sa, moderator = Type_reinforcement,
    VCV = VCV_S2)
res_table_mod_S3 <- get_estimate(model = mod_S3, contra = contra_mod_S3, moderator = Type_reinforcement)

res_table_mod_S3
## # A tibble: 6 x 7
##   Levels                    Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>                        <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Appetitive                 -0.185   -0.333  -3.58e-2  0.0156   -0.649    0.280
## 2 Aversive                   -0.0730  -0.158   1.19e-2  0.0911   -0.521    0.375
## 3 Not applicable             -0.117   -0.235   1.12e-4  0.0502   -0.572    0.338
## 4 Appetitive-Aversive         0.112   -0.0592  2.82e-1  0.198    -0.360    0.583
## 5 Appetitive-Not applicable   0.0674  -0.119   2.54e-1  0.474    -0.410    0.545
## 6 Aversive-Not applicable    -0.0442  -0.173   8.46e-2  0.497    -0.502    0.414

Age of stress

The age when individuals were exposed to stress

mod_S4 <-rma.mv(yi = lnRR_Sa, V = VCV_S, mod = ~Age_stress_exposure-1, random = list(~1|Study_ID,
                                                                                       ~1|ES_ID,
                                                                                       ~1|Strain),
                test = "t",
                data = dat)
summary(mod_S4) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -12.4083   24.8166   38.8166   56.1579   40.2166   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0048  0.0694     30     no  Study_ID 
## sigma^2.2  0.0392  0.1979     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 88) = 881.1229, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 88) = 4.3703, p-val = 0.0029
## 
## Model Results:
## 
##                                     estimate      se     tval  df    pval 
## Age_stress_exposureAdolescent         0.0074  0.1159   0.0641  88  0.9490 
## Age_stress_exposureAdult             -0.2279  0.0622  -3.6664  88  0.0004 
## Age_stress_exposureEarly postnatal   -0.0561  0.0435  -1.2891  88  0.2007 
## Age_stress_exposurePrenatal          -0.1145  0.0743  -1.5404  88  0.1271 
##                                       ci.lb    ci.ub 
## Age_stress_exposureAdolescent       -0.2228   0.2377      
## Age_stress_exposureAdult            -0.3514  -0.1044  *** 
## Age_stress_exposureEarly postnatal  -0.1425   0.0304      
## Age_stress_exposurePrenatal         -0.2621   0.0332      
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S4) 
##   R2_marginal R2_coditional 
##    0.09987307    1.00000000
Age_S <- orchard_plot(mod_S4, mod = "Age_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34", "grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34","grey34")) +
    geom_signif(comparisons = list(c("Adult", "Early postnatal")),
              annotations = "*") +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Age_S 

Fig. 5d Orchard plot showing the group-wise means of the categorical variable ‘Age_stress_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_S4 <- contrast_fun(data = dat, response = lnRR_Sa, moderator = Age_stress_exposure,
    VCV = VCV_S)
res_table_mod_S4 <- get_estimate(model = mod_S4, contra = contra_mod_S4, moderator = Age_stress_exposure)

res_table_mod_S4
## # A tibble: 10 x 7
##    Levels                   Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##    <chr>                       <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
##  1 Adolescent                0.00743  -0.223    0.238  9.49e-1   -0.469    0.484
##  2 Adult                    -0.228    -0.351   -0.104  4.20e-4   -0.663    0.207
##  3 Early postnatal          -0.0561   -0.142    0.0304 2.01e-1   -0.482    0.370
##  4 Prenatal                 -0.114    -0.262    0.0332 1.27e-1   -0.557    0.328
##  5 Adolescent-Adult         -0.235    -0.497    0.0260 7.70e-2   -0.727    0.257
##  6 Adolescent-Early postna… -0.0635   -0.309    0.182  6.09e-1   -0.547    0.421
##  7 Adolescent-Prenatal      -0.122    -0.395    0.152  3.78e-1   -0.620    0.377
##  8 Adult-Early postnatal     0.172     0.0211   0.323  2.60e-2   -0.271    0.615
##  9 Adult-Prenatal            0.113    -0.0791   0.306  2.45e-1   -0.346    0.573
## 10 Early postnatal-Prenatal -0.0584   -0.229    0.113  4.99e-1   -0.509    0.392

Type of stress

The type of stressor used

dat5 <- filter(dat, Type_stress_exposure %in% c("Restraint", "Noise", "MS", "Combination"))
VCV_S3 <- impute_covariance_matrix(vi = dat5$lnRRV_S, cluster = dat5$Study_ID, r = 0.5)

mod_S5 <- rma.mv(yi = lnRR_Sa, V = VCV_S3, mod = ~Type_stress_exposure-1, random = list(~1|Study_ID,
                                                                                         ~1|ES_ID,
                                                                                         ~1|Strain),
                 test = "t",
                 data = dat5)
summary(mod_S5) 
## 
## Multivariate Meta-Analysis Model (k = 85; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -11.4138   22.8276   36.8276   53.5887   38.3618   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0115  0.1071     25     no  Study_ID 
## sigma^2.2  0.0401  0.2002     85     no     ES_ID 
## sigma^2.3  0.0000  0.0000      4     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 81) = 897.4553, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 81) = 2.8767, p-val = 0.0278
## 
## Model Results:
## 
##                                  estimate      se     tval  df    pval    ci.lb 
## Type_stress_exposureCombination   -0.0500  0.0892  -0.5605  81  0.5767  -0.2274 
## Type_stress_exposureMS            -0.0539  0.0560  -0.9630  81  0.3384  -0.1653 
## Type_stress_exposureNoise         -0.1203  0.1036  -1.1608  81  0.2491  -0.3265 
## Type_stress_exposureRestraint     -0.2101  0.0704  -2.9863  81  0.0037  -0.3501 
##                                    ci.ub 
## Type_stress_exposureCombination   0.1274     
## Type_stress_exposureMS            0.0575     
## Type_stress_exposureNoise         0.0859     
## Type_stress_exposureRestraint    -0.0701  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S5)
##   R2_marginal R2_coditional 
##    0.07029554    1.00000000
Stressor<- orchard_plot(mod_S5, mod = "Type_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34", "grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Stressor

Fig. 5e Orchard plot showing the group-wise means of the categorical variable ‘Type_stress_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_S5 <- contrast_fun(data = dat5, response = lnRR_Sa, moderator = Type_stress_exposure,
    VCV = VCV_S3)
res_table_mod_S5 <- get_estimate(model = mod_S5, contra = contra_mod_S5, moderator = Type_stress_exposure)

res_table_mod_S5
## # A tibble: 10 x 7
##    Levels                Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##    <chr>                    <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
##  1 Combination           -0.0500    -0.227   0.127  0.577     -0.535    0.435
##  2 MS                    -0.0539    -0.165   0.0575 0.338     -0.519    0.411
##  3 Noise                 -0.120     -0.326   0.0859 0.249     -0.617    0.376
##  4 Restraint             -0.210     -0.350  -0.0701 0.00373   -0.683    0.263
##  5 Combination-MS        -0.00393   -0.213   0.206  0.970     -0.502    0.494
##  6 Combination-Noise     -0.0703    -0.342   0.202  0.608     -0.598    0.457
##  7 Combination-Restraint -0.160     -0.386   0.0658 0.162     -0.665    0.345
##  8 MS-Noise              -0.0664    -0.301   0.168  0.575     -0.575    0.443
##  9 MS-Restraint          -0.156     -0.335   0.0227 0.0861    -0.642    0.330
## 10 Noise-Restraint       -0.0898    -0.339   0.159  0.475     -0.606    0.426

Stess duration

Was the stress acute or chronic?

dat6 <- filter(dat, Stress_duration %in% c("Chronic", "Acute"))
VCV_S4 <- impute_covariance_matrix(vi = dat6$lnRRV_S, cluster = dat6$Study_ID, r = 0.5)

mod_S6 <-rma.mv(yi = lnRR_Sa, V = VCV_S4, mod = ~Stress_duration-1, random = list(~1|Study_ID,
                                                                                   ~1|ES_ID,
                                                                                   ~1|Strain),
                test = "t",
                data = dat6)
summary(mod_S6) 
## 
## Multivariate Meta-Analysis Model (k = 89; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -13.7898   27.5796   37.5796   49.9092   38.3204   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0062  0.0786     29     no  Study_ID 
## sigma^2.2  0.0391  0.1978     89     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 87) = 915.9393, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 87) = 6.6661, p-val = 0.0020
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb    ci.ub 
## Stress_durationAcute      0.0135  0.0659   0.2045  87  0.8384  -0.1176   0.1445 
## Stress_durationChronic   -0.1360  0.0373  -3.6456  87  0.0005  -0.2101  -0.0618 
##  
## Stress_durationAcute 
## Stress_durationChronic  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_S6) 
##   R2_marginal R2_coditional 
##    0.08245896    1.00000000
Duration_S <- orchard_plot(mod_S6, mod = "Stress_duration", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
    geom_signif(comparisons = list(c("Chronic", "Acute")),
              annotations = "*") +
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 

Duration_S 

Fig. 5f Orchard plot showing the group-wise means of the categorical variable ‘Stress_duration’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_S6 <- contrast_fun(data = dat6, response = lnRR_Sa, moderator = Stress_duration,
    VCV = VCV_S4)
res_table_mod_S6 <- get_estimate(model = mod_S6, contra = contra_mod_S6, moderator = Stress_duration)

res_table_mod_S6
## # A tibble: 3 x 7
##   Levels        Estimate Lower_CI Upper_CI  P_value Lower_PI Upper_PI
##   <chr>            <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
## 1 Acute           0.0135   -0.118  0.145   0.838      -0.429    0.456
## 2 Chronic        -0.136    -0.210 -0.0618  0.000453   -0.565    0.294
## 3 Acute-Chronic  -0.149    -0.300  0.00111 0.0517     -0.599    0.300

Publication bias & sensitivity analysis

Multi-moderator model

We ran a multi-moderator ‘full’ model of all moderators. We ran model selection based on AIC and selected the top set of models within delta AIC of 6 and calculated the importance of each moderator (i.e., Akaike weights) within this top model set.

# selecting moderator levels with k >=5
dat_Sfm <- dat %>%
    filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"), Type_reinforcement %in%
        c("Appetitive", "Aversive", "Not applicable"), Type_stress_exposure %in%
        c("Restraint", "Noise", "MS", "Combination"), Stress_duration %in% c("Chronic",
        "Acute"))

# VCV_Sfm <- impute_covariance_matrix(vi = dat_Sfm$lnRRV_E, cluster =
# dat_Sfm$Study_ID, r = 0.5)

mod_Sfm <- rma.mv(yi = lnRR_Sa, V = VCV_Sfm, mod = ~Type_assay - 1 + Learning_vs_memory +
    Type_reinforcement + Type_stress_exposure + Age_stress_exposure + Stress_duration,
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), test = "t", data = dat_Sfm)
# summary(mod_Sfm) r2_ml(mod_Sfm)

res_Sfm <- dredge(mod_Sfm, trace = 2)
saveRDS(res_Sfm, file = here("Rdata", "res_Sfm.rds"))
# also saving the full model and data
saveRDS(mod_Sfm, file = here("Rdata", "mod_Sfm.rds"))
saveRDS(dat_Sfm, file = here("Rdata", "dat_Sfm.rds"))

The akaike weights for the top set of models with AIC < 6

dat_Sfm <- readRDS(file = here("Rdata", "dat_Sfm.rds"))
mod_Sfm <- readRDS(file = here("Rdata", "mod_Sfm.rds"))
res_Sfm <- readRDS(file = here("Rdata", "res_Sfm.rds"))
res_Sfm2 <- subset(res_Sfm, delta <= 6, recalc.weights = FALSE)
importance(res_Sfm2)
##                      Type_assay Stress_duration Type_stress_exposure
## Sum of weights:      0.91       0.88            0.22                
## N containing models:    7          6               2                
##                      Learning_vs_memory Age_stress_exposure Type_reinforcement
## Sum of weights:      0.16               0.04                0.04              
## N containing models:    2                  1                   1

Funnel plot

We produced funnel plots of effect sizes against the residuals of the full model to visually inspect for funnel asymmetry.

Used to produce Fig. 7b

# funnel plot
Funnel_S <- funnel(mod_Sfm, xlab = "lnRR", ylab = "Standard Error")

# Funnel_S

Fig.7b Funnel plot showing the standard error and residuals (lnRR) from the full model.

Egger’s regression and time-lag bias

We fitted effective sample size calculated as:

\[ \sqrt{\frac {1} { \tilde{N} }} = \sqrt{\frac {1} { N_\text{ES}} + \frac{1}{N_\text{EC}} + \frac {1}{N_\text{CS}} + \frac{1}{N_\text{CC}}}, \]

and year of publication as moderators in the full model to inferentially test for funnel asymmetry and a decrease in effect sizes with publication year.

# calculating inv effective sample size for use in full meta-regression
VCV_Sfm <- impute_covariance_matrix(vi = dat_Sfm$lnRRV_E, cluster = dat_Sfm$Study_ID,
    r = 0.5)

dat_Sfm$sqrt_inv_e_n <- with(dat_Sfm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))

# time lag bias and eggers regression
dat_Sfm$c_Year_published <- as.vector(scale(dat_Sfm$Year_published, scale = F))

PB_MR_S <- rma.mv(lnRR_Sa, VCV_Sfm, mods = ~1 + sqrt_inv_e_n + c_Year_published +
    Type_assay + Learning_vs_memory + Type_reinforcement + Type_stress_exposure +
    Age_stress_exposure + Stress_duration, random = list(~1 | Study_ID, ~1 | ES_ID,
    ~1 | Strain), method = "REML", test = "t", data = dat_Sfm, control = list(optimizer = "optim",
    optmethod = "Nelder-Mead"))

# PB_MR_S

estimates_PB_MR_S <- estimates.CI(PB_MR_S)
estimates_PB_MR_S
##                              estimate         mean       lower       upper
## 1                             intrcpt  0.208757092 -0.47118467  0.88869885
## 2                        sqrt_inv_e_n  0.109877719 -0.90636737  1.12612281
## 3                    c_Year_published -0.006425821 -0.02804904  0.01519740
## 4               Type_assayHabituation -0.663428076 -1.09349872 -0.23335743
## 5               Type_assayRecognition -0.069789046 -0.41156145  0.27198335
## 6            Learning_vs_memoryMemory -0.076712961 -0.19562432  0.04219839
## 7          Type_reinforcementAversive  0.039563987 -0.13761334  0.21674132
## 8    Type_reinforcementNot applicable  0.189481532 -0.16955283  0.54851589
## 9              Type_stress_exposureMS  0.233030567 -0.40478886  0.87084999
## 10          Type_stress_exposureNoise -0.020700600 -0.76667312  0.72527192
## 11      Type_stress_exposureRestraint -0.067490308 -0.43366600  0.29868539
## 12           Age_stress_exposureAdult -0.129875123 -0.51040393  0.25065368
## 13 Age_stress_exposureEarly postnatal -0.193461086 -0.89857848  0.51165631
## 14        Age_stress_exposurePrenatal -0.146406300 -0.57377820  0.28096560
## 15             Stress_durationChronic -0.395711964 -0.65566557 -0.13575836

Leave-one-out sensitivity analysis

We individually removed studies to determine if any singular studies hve a disproportionate effect on the meta-analytic mean and CI.

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for (i in 1:length(levels(dat$Study_ID))) {
    d <- dat %>%
        filter(Study_ID != levels(dat$Study_ID)[i])

    VCV_Sb <- impute_covariance_matrix(vi = d$lnRRV_E, cluster = d$Study_ID, r = 0.5)

    LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_Sa, V = VCV_Sb, random = list(~1 |
        Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", data = dat[dat$Study_ID !=
        levels(dat$Study_ID)[i], ])
}


# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_S0) {
    df <- data.frame(est = mod_S0$b, lower = mod_S0$ci.lb, upper = mod_S0$ci.ub)
    return(df)
}


# using dplyr to form data frame
MA_CVR_S <- lapply(LeaveOneOut_effectsize, function(x) est.func(x)) %>%
    bind_rows %>%
    mutate(left_out = levels(dat$Study_ID))

saveRDS(MA_CVR_S, file = here("Rdata", "MA_CVR_S.rds"))

Used to produce Fig. S4

MA_CVR_S <- readRDS(file = here("Rdata", "MA_CVR_S.rds"))

# telling ggplot to stop reordering factors
MA_CVR_S$left_out <- as.factor(MA_CVR_S$left_out)
MA_CVR_S$left_out <- factor(MA_CVR_S$left_out, levels = MA_CVR_S$left_out)

# plotting
leaveoneout_S <- ggplot(MA_CVR_S) + geom_hline(yintercept = 0, lty = 2, lwd = 1) +
    geom_hline(yintercept = mod_S0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
    geom_hline(yintercept = mod_S0$b, lty = 1, lwd = 0.75, colour = "black") + geom_hline(yintercept = mod_S0$ci.ub,
    lty = 3, lwd = 0.75, colour = "black") + geom_pointrange(aes(x = left_out, y = est,
    ymin = lower, ymax = upper)) + xlab("Study left out") + ylab("lnRR, 95% CI") +
    coord_flip() + theme(panel.grid.minor = element_blank()) + theme_bw() + theme(panel.grid.major = element_blank()) +
    theme(panel.grid.minor.x = element_blank()) + theme(axis.text.y = element_text(size = 6))

leaveoneout_S

dat$Study_ID <- as.integer(dat$Study_ID)

Fig. S4 Leave-one-group-out analysis showing meta-analytic mean and 95% CI when each individual study is removed from the data set.

Using SMD

We re-ran the main effect of stress meta-analytic model using standardised mean difference (SMD) instead of lnRR

mod_S0a <- rma.mv(yi = SMD_Sa, V = VCV_Sa, random = list(~1 | Study_ID, ~1 | ES_ID,
    ~1 | Strain), test = "t", data = dat)
summary(mod_S0a)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -120.2817   240.5634   248.5634   258.6068   249.0285   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.3874  0.6224     30     no  Study_ID 
## sigma^2.2  0.4969  0.7049     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 818.5592, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.4256  0.1498  -2.8403  91  0.0056  -0.7232  -0.1279  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S0a)
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 8.959540e-01 3.924790e-01 5.034750e-01 1.438454e-09

Risk of Bias

Including if the study was randomised as a moderator and conducting a pair-wise contrast

mod_randomised_S <- rma.mv(yi = lnRR_Sa, V = VCV_S, mod = ~ROB_randomisation - 1,
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), test = "t", data = dat)

summary(mod_randomised_S)
r2_ml(mod_randomised_S)
contra_mod_randomised_S <- contrast_fun(data = dat, response = lnRR_Sa, moderator = ROB_randomisation,
    VCV = VCV_S)
res_table_mod_randomised_S <- get_estimate(model = mod_randomised_S, contra = contra_mod_randomised_S,
    moderator = ROB_randomisation)

res_table_mod_randomised_S
## # A tibble: 3 x 7
##   Levels      Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>          <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Unclear      -0.0672   -0.164   0.0291 0.169     -0.509    0.374
## 2 Yes          -0.139    -0.230  -0.0480 0.00317   -0.580    0.301
## 3 Unclear-Yes  -0.0719   -0.204   0.0607 0.284     -0.523    0.379

Including if the study used blinding and conducting a pair-wise contrast

mod_blinding_S <- rma.mv(yi = lnRR_Sa, V = VCV_S, mod = ~ROB_blinding - 1, random = list(~1 |
    Study_ID, ~1 | ES_ID, ~1 | Strain), test = "t", data = dat)

summary(mod_blinding_S)
r2_ml(mod_blinding_S)
contra_mod_blinding_S <- contrast_fun(data = dat, response = lnRR_Sa, moderator = ROB_blinding,
    VCV = VCV_S)
res_table_mod_blinding_S <- get_estimate(model = mod_blinding_S, contra = contra_mod_blinding_S,
    moderator = ROB_blinding)

res_table_mod_blinding_S
## # A tibble: 3 x 7
##   Levels      Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>          <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Unclear      -0.119    -0.196  -0.0419 0.00288   -0.564    0.326
## 2 Yes          -0.0567   -0.202   0.0890 0.442     -0.518    0.405
## 3 Unclear-Yes   0.0625   -0.102   0.227  0.454     -0.406    0.531

Interaction: enrichment x stress

Meta-analysis

To quantify differences in individual performance in cognitive assay with the interaction of environmental enrichment and stress, we used the logarithm of response ratio (lnRR) calculated as:

\[ \ln{\text{RR}_\text{interaction}} = \left(\ln M_\text{ES} - \ln M_\text{CS} \right) - \left( \ln M_\text{EC} - \ln M_\text{CC} \right) = \ln \left( \frac {M_\text{ES} / M_\text{CS} } {M_\text{EC} / \ M_\text{CC}} \right) \]

Variance was calculated as:

\[ \text{var}(\ln{\text{RR}_\text{interaction}}) = \frac {SD_\text{ES}^2} { N_\text{ES} M_\text{ES}^2 } + \frac{SD_\text{EC}^2}{N_\text{EC}M_\text{EC}^2} + \frac {SD_\text{CS}^2}{N_\text{CS} M_\text{CS}^2} + \frac{SD_\text{CC}^2}{N_\text{CC} M_\text{CC}^2}. \] Variance was converted in to variance-covariance (VCV) matrix (see above in ‘Data organisation’) to control for non-independence in sampling variance from the same studies.

mod_ES0 <- rma.mv(yi = lnRR_ESa, V = VCV_ES, random = list(~1|Study_ID,
                                                             ~1|ES_ID,
                                                             ~1|Strain),
                  test = "t", 
                  data = dat)

summary(mod_ES0) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.8178   81.6355   89.6355   99.6790   90.1006   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0316  0.1777     30     no  Study_ID 
## sigma^2.2  0.0229  0.1513     92     no     ES_ID 
## sigma^2.3  0.0030  0.0544      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 303.2179, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1229  0.0596  2.0605  91  0.0422  0.0044  0.2414  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES0) 
##    I2_total I2_Study_ID    I2_ES_ID   I2_Strain 
##  0.81703063  0.44913873  0.32576306  0.04212884
orchard_plot(mod_ES0, mod = "Int", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 5, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 24), # change font sizes
        legend.title = element_text(size = 15),
        legend.text = element_text(size = 13)) 

Fig. 3 Orchard plot showing meta-analytic mean and 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Meta-regression: uni-moderator

To explain some of the unexplained variation in the interaction of environmental enrichment and stress, we conducted a series of uni-moderator analyses. We calculated marginal R2 for each moderator as well as conducted a series of pair-wise contrasts between in moderator category.

Any moderator categories with k < 5 were removed.

Learning vs Memory

Was the response learning or memory?

mod_ES1 <-  rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Learning_vs_memory-1, random = list(~1|Study_ID, 
                                                                                           ~1|ES_ID,
                                                                                           ~1|Strain),
                   test = "t",
                   data = dat)

summary(mod_ES1) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.4769   80.9539   90.9539  103.4529   91.6682   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0292  0.1708     30     no  Study_ID 
## sigma^2.2  0.0232  0.1524     92     no     ES_ID 
## sigma^2.3  0.0034  0.0582      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 299.1854, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 2.9219, p-val = 0.0590
## 
## Model Results:
## 
##                             estimate      se    tval  df    pval    ci.lb 
## Learning_vs_memoryLearning    0.1744  0.0722  2.4166  90  0.0177   0.0310 
## Learning_vs_memoryMemory      0.1057  0.0619  1.7065  90  0.0914  -0.0174 
##                              ci.ub 
## Learning_vs_memoryLearning  0.3178  * 
## Learning_vs_memoryMemory    0.2288  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES1) 
##   R2_marginal R2_coditional 
##     0.0197648     0.9405080
LvsM_ES <- orchard_plot(mod_ES1, mod = "Learning_vs_memory", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

LvsM_ES 

Fig. 6a Orchard plot showing the group-wise means of the categorical variable ‘Learning_vs_memory’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_ES1 <- contrast_fun(data = dat, response = lnRR_ESa, moderator = Learning_vs_memory,
    VCV = VCV_ES)
res_table_mod_ES1 <- get_estimate(model = mod_ES1, contra = contra_mod_ES1, moderator = Learning_vs_memory)

res_table_mod_ES1
## # A tibble: 3 x 7
##   Levels          Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>              <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Learning          0.174    0.0310   0.318   0.0177   -0.316    0.665
## 2 Memory            0.106   -0.0174   0.229   0.0914   -0.379    0.591
## 3 Learning-Memory  -0.0687  -0.176    0.0382  0.205    -0.550    0.413

Type of assay

The broad category of the type of assay used to measure learning or memory

VCV_ES1 <- impute_covariance_matrix(vi = dat1$lnRRV_ES, cluster = dat$Study_ID, r = 0.5)

mod_ES2 <- rma.mv(yi = lnRR_ESa, V = VCV_ES1, mod = ~Type_assay-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                  test = "t",
                  data = dat1)

summary(mod_ES2)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0874   78.1748   90.1748  105.1066   91.1992   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0370  0.1924     30     no  Study_ID 
## sigma^2.2  0.0192  0.1386     92     no     ES_ID 
## sigma^2.3  0.0018  0.0422      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 293.9385, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.1062, p-val = 0.0305
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb   ci.ub 
## Type_assayConditioning    0.1525  0.0589   2.5877  89  0.0113   0.0354  0.2696 
## Type_assayHabituation     0.1990  0.1415   1.4070  89  0.1629  -0.0820  0.4801 
## Type_assayRecognition    -0.0048  0.0800  -0.0606  89  0.9518  -0.1637  0.1541 
##  
## Type_assayConditioning  * 
## Type_assayHabituation 
## Type_assayRecognition 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES2) 
##   R2_marginal R2_coditional 
##    0.05775809    0.97105550
Learning_ES <- orchard_plot(mod_ES2, mod = "Type_assay", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
    geom_signif(comparisons = list(c("Conditioning", "Recognition")),
              annotations = "*") +
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Learning_ES

Fig. 6b Orchard plot showing the group-wise means of the categorical variable ‘Type_assay’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_ES2 <- contrast_fun(data = dat1, response = lnRR_ESa, moderator = Type_assay,
    VCV = VCV_ES1)
res_table_mod_ES2 <- get_estimate(model = mod_ES2, contra = contra_mod_ES2, moderator = Type_assay)

res_table_mod_ES2
## # A tibble: 6 x 7
##   Levels                   Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>                       <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Conditioning              0.153     0.0354   0.270   0.0113   -0.340    0.645
## 2 Habituation               0.199    -0.0820   0.480   0.163    -0.356    0.754
## 3 Recognition              -0.00485  -0.164    0.154   0.952    -0.509    0.499
## 4 Conditioning-Habituation  0.0465   -0.219    0.312   0.728    -0.501    0.594
## 5 Conditioning-Recognition -0.157    -0.304   -0.0105  0.0360   -0.658    0.343
## 6 Habituation-Recognition  -0.204    -0.488    0.0801  0.157    -0.760    0.353

Type of reinforcement

If conditioning was used, was aversive or appetitive reinforcement used?

VCV_ES2 <- impute_covariance_matrix(vi = dat2$lnRRV_ES, cluster = dat2$Study_ID, r = 0.5)

mod_ES3 <- rma.mv(yi = lnRR_ESa, V = VCV_ES2, mod = ~ Type_reinforcement-1, random = list(~1|Study_ID,
                                                                                               ~1|ES_ID,
                                                                                               ~1|Strain),
                  test = "t",
                  data = dat2)

summary(mod_ES3)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0604   78.1208   90.1208  105.0526   91.1452   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0382  0.1954     30     no  Study_ID 
## sigma^2.2  0.0189  0.1377     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 293.4724, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.2547, p-val = 0.0254
## 
## Model Results:
## 
##                                   estimate      se    tval  df    pval    ci.lb 
## Type_reinforcementAppetitive        0.1007  0.1075  0.9366  89  0.3515  -0.1129 
## Type_reinforcementAversive          0.1573  0.0569  2.7618  89  0.0070   0.0441 
## Type_reinforcementNot applicable    0.0147  0.0702  0.2101  89  0.8341  -0.1247 
##                                    ci.ub 
## Type_reinforcementAppetitive      0.3143     
## Type_reinforcementAversive        0.2704  ** 
## Type_reinforcementNot applicable  0.1541     
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES3) 
##   R2_marginal R2_coditional 
##     0.0586952     1.0000000
Reinforcement_ES <- orchard_plot(mod_ES3, mod = "Type_reinforcement", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
    geom_signif(comparisons = list(c("Aversive", "Not applicable")),
              annotations = "*") +
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Reinforcement_ES 

Fig. 6c Orchard plot showing the group-wise means of the categorical variable ‘Type_reinforcement’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_ES3 <- contrast_fun(data = dat2, response = lnRR_ESa, moderator = Type_reinforcement,
    VCV = VCV_ES2)
res_table_mod_ES3 <- get_estimate(model = mod_ES3, contra = contra_mod_ES3, moderator = Type_reinforcement)

res_table_mod_ES3
## # A tibble: 6 x 7
##   Levels                    Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>                        <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Appetitive                  0.101   -0.113   0.314   0.351     -0.420    0.621
## 2 Aversive                    0.157    0.0441  0.270   0.00698   -0.331    0.645
## 3 Not applicable              0.0147  -0.125   0.154   0.834     -0.480    0.510
## 4 Appetitive-Aversive         0.0566  -0.182   0.295   0.639     -0.475    0.588
## 5 Appetitive-Not applicable  -0.0859  -0.333   0.161   0.492     -0.621    0.450
## 6 Aversive-Not applicable    -0.143   -0.278  -0.00744 0.0389    -0.636    0.351

Age of enrichment

The age when individuals were exposed to environmental enrichment

VCV_ES3 <- impute_covariance_matrix(vi = dat3$lnRRV_ES, cluster = dat3$Study_ID, r = 0.5)

mod_ES4 <- rma.mv(yi = lnRR_ESa, V = VCV_ES3, mod = ~Age_EE_exposure-1, random = list(~1|Study_ID,
                                                                                    ~1|ES_ID,
                                                                                    ~1|Strain),
                 test = "t",
                 data = dat3)

summary(mod_ES4) 
## 
## Multivariate Meta-Analysis Model (k = 88; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -36.6407   73.2813   83.2813   95.5531   84.0313   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0332  0.1822     29     no  Study_ID 
## sigma^2.2  0.0207  0.1439     88     no     ES_ID 
## sigma^2.3  0.0007  0.0265      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 86) = 288.6493, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 86) = 3.1308, p-val = 0.0487
## 
## Model Results:
## 
##                            estimate      se    tval  df    pval    ci.lb 
## Age_EE_exposureAdolescent    0.1284  0.0583  2.2006  86  0.0304   0.0124 
## Age_EE_exposureAdult         0.1247  0.0921  1.3538  86  0.1793  -0.0584 
##                             ci.ub 
## Age_EE_exposureAdolescent  0.2444  * 
## Age_EE_exposureAdult       0.3077    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES4) 
##   R2_marginal R2_coditional 
##  0.0000400928  0.9871095822
Age_enrichment_ES <- orchard_plot(mod_ES4, mod = "Age_EE_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Age_enrichment_ES

Fig. 6d Orchard plot showing the group-wise means of the categorical variable ‘Age_EE_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_ES4 <- contrast_fun(data = dat3, response = lnRR_ESa, moderator = Age_EE_exposure,
    VCV = VCV_ES3)
res_table_mod_ES4 <- get_estimate(model = mod_ES4, contra = contra_mod_ES4, moderator = Age_EE_exposure)

res_table_mod_ES4
## # A tibble: 3 x 7
##   Levels           Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>               <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Adolescent        0.128     0.0124    0.244  0.0304   -0.350    0.607
## 2 Adult             0.125    -0.0584    0.308  0.179    -0.375    0.624
## 3 Adolescent-Adult -0.00373  -0.213     0.205  0.972    -0.513    0.506

Exercise enrichment

Did enrichment involve the addition of apparatus for voluntary exercise (e.g., a wheel or treadmill)?

mod_ES5<- rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~EE_exercise-1, random = list(~1|Study_ID, 
    ~1|ES_ID,
    ~1|Strain),
     test = "t",
     data = dat)

summary(mod_ES5)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.4968   80.9935   90.9935  103.4926   91.7078   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0325  0.1803     30     no  Study_ID 
## sigma^2.2  0.0230  0.1517     92     no     ES_ID 
## sigma^2.3  0.0065  0.0805      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 297.3270, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 1.8401, p-val = 0.1647
## 
## Model Results:
## 
##                         estimate      se    tval  df    pval    ci.lb   ci.ub 
## EE_exerciseExercise       0.1051  0.0780  1.3474  90  0.1812  -0.0499  0.2602 
## EE_exerciseNo exercise    0.1687  0.0967  1.7448  90  0.0844  -0.0234  0.3609 
##  
## EE_exerciseExercise 
## EE_exerciseNo exercise  . 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES5) 
##   R2_marginal R2_coditional 
##    0.01474459    0.89712469
Exercise_ES <- orchard_plot(mod_ES5, mod = "EE_exercise", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Exercise_ES

Fig. 6d Orchard plot showing the group-wise means of the categorical variable ‘EE_exercise’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_ES5 <- contrast_fun(data = dat, response = lnRR_ESa, moderator = EE_exercise,
    VCV = VCV_ES)
res_table_mod_ES5 <- get_estimate(model = mod_ES5, contra = contra_mod_ES5, moderator = EE_exercise)

res_table_mod_ES5
## # A tibble: 3 x 7
##   Levels               Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>                   <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Exercise               0.105   -0.0499    0.260  0.181    -0.413    0.624
## 2 No exercise            0.169   -0.0234    0.361  0.0844   -0.362    0.699
## 3 Exercise-No exercise   0.0636  -0.138     0.265  0.532    -0.470    0.598

Social enrichment

Did enrichment involve more conspecifics (note that we did not include studies that only provided social enrichment but no other form of abiotic enrichment)?

VCV_ES4 <- impute_covariance_matrix(vi = dat4$lnRRV_ES, cluster = dat4$Study_ID, r = 0.5)
mod_ES6<- rma.mv(yi = lnRR_ESa, V = VCV_ES4, mod = ~EE_social-1, random = list(~1|Study_ID,
                                                                                ~1|ES_ID,
                                                                                ~1|Strain),
                 test = "t",
                 data = dat4)

summary(mod_ES6)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -40.1871   80.3742   90.3742  102.8733   91.0885   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0311  0.1762     30     no  Study_ID 
## sigma^2.2  0.0230  0.1518     92     no     ES_ID 
## sigma^2.3  0.0046  0.0676      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 90) = 302.0860, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 90) = 2.4198, p-val = 0.0947
## 
## Model Results:
## 
##                      estimate      se    tval  df    pval    ci.lb   ci.ub 
## EE_socialNon-social    0.0750  0.0807  0.9300  90  0.3549  -0.0853  0.2353    
## EE_socialSocial        0.1720  0.0788  2.1842  90  0.0315   0.0156  0.3285  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES6) 
##   R2_marginal R2_coditional 
##    0.03751906    0.92501263
Social_ES <- orchard_plot(mod_ES6, mod = "EE_social", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Social_ES

Fig. 6e Orchard plot showing the group-wise means of the categorical variable ‘EE_social’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_ES6 <- contrast_fun(data = dat4, response = lnRR_ESa, moderator = EE_social,
    VCV = VCV_ES4)
res_table_mod_ES6 <- get_estimate(model = mod_ES6, contra = contra_mod_ES6, moderator = EE_social)

res_table_mod_ES6
## # A tibble: 3 x 7
##   Levels            Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>                <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Non-social          0.0750  -0.0853    0.235  0.355    -0.432    0.582
## 2 Social              0.172    0.0156    0.329  0.0315   -0.334    0.678
## 3 Non-social-Social   0.0970  -0.0889    0.283  0.303    -0.419    0.613

Age of stress

The age when individuals were exposed to stress

mod_ES7 <-rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Age_stress_exposure-1, random = list(~1|Study_ID,
                                                                                          ~1|ES_ID,
                                                                                          ~1|Strain),
                 test = "t",
                 data = dat)
summary(mod_ES7) 
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0917   78.1834   92.1834  109.5247   93.5834   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0295  0.1718     30     no  Study_ID 
## sigma^2.2  0.0232  0.1522     92     no     ES_ID 
## sigma^2.3  0.0091  0.0954      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 88) = 286.4225, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 88) = 1.5932, p-val = 0.1832
## 
## Model Results:
## 
##                                     estimate      se     tval  df    pval 
## Age_stress_exposureAdolescent        -0.0137  0.1762  -0.0775  88  0.9384 
## Age_stress_exposureAdult              0.1677  0.1140   1.4708  88  0.1449 
## Age_stress_exposureEarly postnatal    0.1067  0.0920   1.1602  88  0.2491 
## Age_stress_exposurePrenatal           0.3179  0.1311   2.4254  88  0.0173 
##                                       ci.lb   ci.ub 
## Age_stress_exposureAdolescent       -0.3639  0.3366    
## Age_stress_exposureAdult            -0.0589  0.3942    
## Age_stress_exposureEarly postnatal  -0.0761  0.2896    
## Age_stress_exposurePrenatal          0.0574  0.5784  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES7) 
##   R2_marginal R2_coditional 
##    0.09276574    0.86630830
Age_stress_ES<-orchard_plot(mod_ES7, mod = "Age_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34", "grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
       axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Age_stress_ES

Fig. 6d Orchard plot showing the group-wise means of the categorical variable ‘Age_stress_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_ES7 <- contrast_fun(data = dat, response = lnRR_ESa, moderator = Age_stress_exposure,
    VCV = VCV_ES)
res_table_mod_ES7 <- get_estimate(model = mod_ES7, contra = contra_mod_ES7, moderator = Age_stress_exposure)

res_table_mod_ES7
## # A tibble: 10 x 7
##    Levels                   Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##    <chr>                       <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
##  1 Adolescent                -0.0137  -0.364     0.337  0.938    -0.619    0.592
##  2 Adult                      0.168   -0.0589    0.394  0.145    -0.376    0.711
##  3 Early postnatal            0.107   -0.0761    0.290  0.249    -0.420    0.634
##  4 Prenatal                   0.318    0.0574    0.578  0.0173   -0.241    0.876
##  5 Adolescent-Adult           0.181   -0.236     0.598  0.390    -0.465    0.828
##  6 Adolescent-Early postna…   0.120   -0.275     0.515  0.546    -0.512    0.753
##  7 Adolescent-Prenatal        0.332   -0.105     0.768  0.135    -0.328    0.991
##  8 Adult-Early postnatal     -0.0609  -0.280     0.158  0.581    -0.601    0.479
##  9 Adult-Prenatal             0.150   -0.132     0.432  0.292    -0.419    0.719
## 10 Early postnatal-Prenatal   0.211   -0.0462    0.469  0.107    -0.346    0.768

Type of stress

The type of stressor used

VCV_ES5 <- impute_covariance_matrix(vi = dat5$lnRRV_ES, cluster = dat5$Study_ID, r = 0.5)
mod_ES8 <- rma.mv(yi = lnRR_ESa, V = VCV_ES5, mod = ~Type_stress_exposure-1, random = list(~1|Study_ID,
                                                                                            ~1|ES_ID,
                                                                                            ~1|Strain),
                  test = "t",
                  data = dat5)
summary(mod_ES8)
## 
## Multivariate Meta-Analysis Model (k = 85; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -34.4046   68.8091   82.8091   99.5703   84.3434   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0426  0.2064     25     no  Study_ID 
## sigma^2.2  0.0232  0.1524     85     no     ES_ID 
## sigma^2.3  0.0104  0.1021      4     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 81) = 281.9708, p-val < .0001
## 
## Test of Moderators (coefficients 1:4):
## F(df1 = 4, df2 = 81) = 0.5137, p-val = 0.7258
## 
## Model Results:
## 
##                                  estimate      se    tval  df    pval    ci.lb 
## Type_stress_exposureCombination    0.1111  0.1458  0.7618  81  0.4484  -0.1790 
## Type_stress_exposureMS             0.1185  0.1099  1.0784  81  0.2840  -0.1001 
## Type_stress_exposureNoise          0.1651  0.1795  0.9198  81  0.3604  -0.1920 
## Type_stress_exposureRestraint      0.1374  0.1252  1.0978  81  0.2755  -0.1116 
##                                   ci.ub 
## Type_stress_exposureCombination  0.4011    
## Type_stress_exposureMS           0.3370    
## Type_stress_exposureNoise        0.5221    
## Type_stress_exposureRestraint    0.3865    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES8)
##   R2_marginal R2_coditional 
##   0.004455703   0.863910284
Stressor_ES <- orchard_plot(mod_ES8, mod = "Type_stress_exposure", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34", "grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7))  

Stressor_ES 

Fig. 6e Orchard plot showing the group-wise means of the categorical variable ‘Type_stress_exposure’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_ES8 <- contrast_fun(data = dat5, response = lnRR_ESa, moderator = Type_stress_exposure,
    VCV = VCV_ES5)
res_table_mod_ES8 <- get_estimate(model = mod_ES8, contra = contra_mod_ES8, moderator = Type_stress_exposure)

res_table_mod_ES8
## # A tibble: 10 x 7
##    Levels                Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##    <chr>                    <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
##  1 Combination            0.111     -0.179    0.401   0.448   -0.510    0.732
##  2 MS                     0.118     -0.100    0.337   0.284   -0.473    0.710
##  3 Noise                  0.165     -0.192    0.522   0.360   -0.490    0.820
##  4 Restraint              0.137     -0.112    0.386   0.276   -0.466    0.741
##  5 Combination-MS         0.00741   -0.299    0.313   0.962   -0.621    0.636
##  6 Combination-Noise      0.0540    -0.352    0.460   0.792   -0.629    0.737
##  7 Combination-Restraint  0.0263    -0.300    0.353   0.873   -0.613    0.665
##  8 MS-Noise               0.0466    -0.312    0.405   0.797   -0.609    0.703
##  9 MS-Restraint           0.0189    -0.246    0.284   0.887   -0.591    0.629
## 10 Noise-Restraint       -0.0276    -0.403    0.348   0.884   -0.693    0.638

Stress duration

Was the stress acute or chronic?

VCV_ES6 <- impute_covariance_matrix(vi = dat6$lnRRV_ES, cluster = dat6$Study_ID, r = 0.5)

mod_ES9 <-rma.mv(yi = lnRR_ESa, V = VCV_ES6, mod = ~Stress_duration-1, random = list(~1|Study_ID,
                                                                                      ~1|ES_ID,
                                                                                      ~1|Strain),
                 test = "t",
                 data = dat6)
summary(mod_ES9) 
## 
## Multivariate Meta-Analysis Model (k = 89; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -35.9010   71.8020   81.8020   94.1315   82.5427   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0133  0.1155     29     no  Study_ID 
## sigma^2.2  0.0260  0.1611     89     no     ES_ID 
## sigma^2.3  0.0080  0.0895      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 87) = 278.4877, p-val < .0001
## 
## Test of Moderators (coefficients 1:2):
## F(df1 = 2, df2 = 87) = 4.3877, p-val = 0.0153
## 
## Model Results:
## 
##                         estimate      se     tval  df    pval    ci.lb   ci.ub 
## Stress_durationAcute     -0.0367  0.0930  -0.3946  87  0.6941  -0.2216  0.1482 
## Stress_durationChronic    0.1854  0.0732   2.5347  87  0.0130   0.0400  0.3308 
##  
## Stress_durationAcute 
## Stress_durationChronic  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES9) 
##   R2_marginal R2_coditional 
##     0.1598311     0.8575918
Duration_ES<- orchard_plot(mod_ES9, mod = "Stress_duration", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_colour_manual(values = c("grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34")) +
    geom_signif(comparisons = list(c("Acute", "Chronic")),
              annotations = "*") +
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Duration_ES

Fig. 6f Orchard plot showing the group-wise means of the categorical variable ‘Stress_duration’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_ES9 <- contrast_fun(data = dat6, response = lnRR_ESa, moderator = Stress_duration,
    VCV = VCV_ES6)
res_table_mod_ES9 <- get_estimate(model = mod_ES9, contra = contra_mod_ES9, moderator = Stress_duration)

res_table_mod_ES9
## # A tibble: 3 x 7
##   Levels        Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>            <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Acute          -0.0367  -0.222     0.148  0.694    -0.507    0.433
## 2 Chronic         0.185    0.0400    0.331  0.0130   -0.271    0.642
## 3 Acute-Chronic   0.222    0.0381    0.406  0.0186   -0.248    0.692

Order to treatment exposure

The order in which individuals were exposed to enrichment and stress

mod_ES10 <- rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~Exposure_order -1, random = list(~1|Study_ID, 
    ~1|ES_ID,
    ~1|Strain),
     test = "t",
     data = dat)

summary(mod_ES10)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -39.0408   78.0817   90.0817  105.0135   91.1061   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0316  0.1777     30     no  Study_ID 
## sigma^2.2  0.0227  0.1507     92     no     ES_ID 
## sigma^2.3  0.0000  0.0000      6     no    Strain 
## 
## Test for Residual Heterogeneity:
## QE(df = 89) = 292.2561, p-val < .0001
## 
## Test of Moderators (coefficients 1:3):
## F(df1 = 3, df2 = 89) = 3.1546, p-val = 0.0287
## 
## Model Results:
## 
##                                 estimate      se     tval  df    pval    ci.lb 
## Exposure_orderConcurrently        0.1492  0.1208   1.2351  89  0.2201  -0.0909 
## Exposure_orderEnrichment first   -0.1782  0.1659  -1.0744  89  0.2856  -0.5079 
## Exposure_orderStress first        0.1370  0.0526   2.6046  89  0.0108   0.0325 
##                                  ci.ub 
## Exposure_orderConcurrently      0.3893    
## Exposure_orderEnrichment first  0.1514    
## Exposure_orderStress first      0.2414  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
r2_ml(mod_ES10)
##   R2_marginal R2_coditional 
##     0.1027207     1.0000000
Order_ES <- orchard_plot(mod_ES10, mod = "Exposure_order", xlab = "lnRR", alpha=0.4) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals
  scale_colour_manual(values = c("grey34","grey34","grey34")) +
  scale_fill_manual(values=c("grey34","grey34","grey34")) +
  geom_point(aes(fill = name),  size = 3, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        axis.text.x = element_text(size = 10), # change font sizes
        axis.text.y = element_text(size = 10),
        legend.title = element_text(size = 7),
        legend.text = element_text(size = 7)) 

Order_ES 

Fig. 6g Orchard plot showing the group-wise means of the categorical variable ‘Exposure_order’ with their 95% confidence interval (think black line) and 95% prediction interval (thin black line). Individuals points show observed effect sizes and sample sizes.

Contrasts
contra_mod_ES10 <- contrast_fun(data = dat, response = lnRR_ESa, moderator = Exposure_order,
    VCV = VCV_ES)
res_table_mod_ES10 <- get_estimate(model = mod_ES10, contra = contra_mod_ES10, moderator = Exposure_order)

res_table_mod_ES10
## # A tibble: 6 x 7
##   Levels                    Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>                        <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Concurrently                0.149   -0.0909   0.389   0.220    -0.372    0.671
## 2 Enrichment first           -0.178   -0.508    0.151   0.286    -0.747    0.390
## 3 Stress first                0.137    0.0325   0.241   0.0108   -0.338    0.612
## 4 Concurrently-Enrichment …  -0.327   -0.735    0.0803  0.114    -0.944    0.289
## 5 Concurrently-Stress first  -0.0123  -0.274    0.250   0.926    -0.544    0.520
## 6 Enrichment first-Stress …   0.315   -0.0306   0.661   0.0735   -0.263    0.893

Publication bias & sensitivity analysis

Multi-moderator model

We ran a multi-moderator ‘full’ model of all moderators. We ran model selection based on AIC and selected the top set of models within delta AIC of 6 and calculated the importance of each moderator (i.e., Akaike weights) within this top model set.

dat_ESfm <- dat %>%
    filter(Type_assay %in% c("Recognition", "Habituation", "Conditioning"), Type_reinforcement %in%
        c("Appetitive", "Aversive", "Not applicable"), EE_social %in% c("Social",
        "Non-social"), Age_EE_exposure %in% c("Adult", "Adolescent"), Type_stress_exposure %in%
        c("Restraint", "Noise", "MS", "Combination"), Stress_duration %in% c("Chronic",
        "Acute"), Age_stress_exposure %in% c("Prenatal", "Early postnatal", "Adult"))

# VCV_ESfm <- impute_covariance_matrix(vi = dat_ESfm$lnRRV_ES, cluster =
# dat_ESfm$Study_ID, r = 0.5)

mod_ESfm <- rma.mv(yi = lnRR_Sa, V = VCV_ESfm, mod = ~Type_assay - 1 + Learning_vs_memory +
    Type_reinforcement + EE_social + EE_exercise + Age_EE_exposure + Type_stress_exposure +
    Age_stress_exposure + Stress_duration + Exposure_order, random = list(~1 | Study_ID,
    ~1 | ES_ID, ~1 | Strain), test = "t", data = dat_ESfm)
# summary(mod_ESfm) r2_ml(mod_ESfm)


res_ESfm <- dredge(mod_ESfm, trace = 2)
saveRDS(res_ESfm, file = here("Rdata", "res_ESfm.rds"))
# also saving the full model and data
saveRDS(mod_ESfm, file = here("Rdata", "mod_ESfm.rds"))
saveRDS(dat_ESfm, file = here("Rdata", "dat_ESfm.rds"))

The akaike weights for the top set of models with AIC < 6

dat_ESfm <- readRDS(file = here("Rdata", "dat_ESfm.rds"))
mod_ESfm <- readRDS(file = here("Rdata", "mod_ESfm.rds"))
res_ESfm <- readRDS(file = here("Rdata", "res_ESfm.rds"))
res_ESfm2 <- subset(res_ESfm, delta <= 6, recalc.weights = FALSE)
importance(res_ESfm2)
##                      Type_assay Stress_duration Age_EE_exposure EE_exercise
## Sum of weights:      0.65       0.63            0.26            0.11       
## N containing models:   19         18               7               6       
##                      Learning_vs_memory EE_social Age_stress_exposure
## Sum of weights:      0.08               0.08      0.05               
## N containing models:    4                  4         2               
##                      Type_stress_exposure Exposure_order
## Sum of weights:      0.03                 0.02          
## N containing models:    2                    1

Funnel plot

We produced funnel plots of effect sizes against the residuals of the full model to visually inspect for funnel asymmetry.

Used to produce Fig. 7c

Funnel_ES <- funnel(mod_ESfm, xlab = "lnRR", ylab = "Standard Error")

# Funnel_ES

Fig.7c Funnel plot showing the standard error and residuals (lnRR) from the full model.

Egger’s regression and time-lag bias

We fitted effective sample size calculated as:

\[ \sqrt{\frac {1} { \tilde{N} }} = \sqrt{\frac {1} { N_\text{ES}} + \frac{1}{N_\text{EC}} + \frac {1}{N_\text{CS}} + \frac{1}{N_\text{CC}}}, \]

and year of publication as moderators in the full model to inferentially test for funnel asymmetry and a decrease in effect sizes with publication year.

# calculating inv effective sample size for use in full meta-regression
dat_ESfm$sqrt_inv_e_n <- with(dat_ESfm, sqrt(1/CC_n + 1/EC_n + 1/ES_n + 1/CS_n))
dat_ESfm$c_Year_published <- as.vector(scale(dat_ESfm$Year_published, scale = F))

VCV_ESfm <- impute_covariance_matrix(vi = dat_ESfm$lnRRV_ES, cluster = dat_ESfm$Study_ID,
    r = 0.5)


# time lag bias and eggers regression

PB_MR_ES <- rma.mv(lnRR_ESa, VCV_ESfm, mods = ~1 + sqrt_inv_e_n + c_Year_published +
    Type_assay + Learning_vs_memory + Type_reinforcement + Type_stress_exposure +
    Age_stress_exposure + EE_social + EE_exercise + Stress_duration + Exposure_order,
    random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", test = "t",
    data = dat_ESfm, control = list(optimizer = "optim", optmethod = "Nelder-Mead"))


estimates_PB_MR_ES <- estimates.CI(PB_MR_ES)
estimates_PB_MR_ES
##                              estimate         mean       lower      upper
## 1                             intrcpt  0.104890890 -1.32422406 1.53400584
## 2                        sqrt_inv_e_n -0.380617946 -2.34738544 1.58614955
## 3                    c_Year_published -0.003614793 -0.03254341 0.02531382
## 4               Type_assayHabituation  0.225637592 -0.28343491 0.73471009
## 5               Type_assayRecognition  0.014042786 -0.37390986 0.40199543
## 6            Learning_vs_memoryMemory  0.027907733 -0.10104526 0.15686073
## 7          Type_reinforcementAversive  0.074150779 -0.20556264 0.35386420
## 8    Type_reinforcementNot applicable -0.180164458 -0.64972276 0.28939384
## 9              Type_stress_exposureMS -0.670185502 -1.72077062 0.38039961
## 10          Type_stress_exposureNoise -0.307675466 -1.41676992 0.80141899
## 11      Type_stress_exposureRestraint -0.159808179 -0.87246493 0.55284857
## 12 Age_stress_exposureEarly postnatal  0.472151143 -0.39118506 1.33548735
## 13        Age_stress_exposurePrenatal  0.199706727 -0.39069154 0.79010499
## 14                    EE_socialSocial  0.134840904 -0.25767695 0.52735875
## 15             EE_exerciseNo exercise  0.127498329 -0.18382738 0.43882404
## 16             Stress_durationChronic  0.449057668  0.05381018 0.84430516
## 17     Exposure_orderEnrichment first -0.132255288 -0.74038190 0.47587133
## 18         Exposure_orderStress first -0.057436396 -0.54737789 0.43250509

Leave-one-out analysis

We individually removed studies to determine if any singular studies hve a disproportionate effect on the meta-analytic mean and CI.

dat$Study_ID <- as.factor(dat$Study_ID)

LeaveOneOut_effectsize <- list()
for (i in 1:length(levels(dat$Study_ID))) {
    d <- dat %>%
        filter(Study_ID != levels(dat$Study_ID)[i])

    VCV_ESb <- impute_covariance_matrix(vi = d$lnRRV_ES, cluster = d$Study_ID, r = 0.5)
    LeaveOneOut_effectsize[[i]] <- rma.mv(yi = lnRR_ESa, V = VCV_ESb, random = list(~1 |
        Study_ID, ~1 | ES_ID, ~1 | Strain), method = "REML", data = dat[dat$Study_ID !=
        levels(dat$Study_ID)[i], ])
}


# writing function for extracting est, ci.lb, and ci.ub from all models
est.func <- function(mod_ES0) {
    df <- data.frame(est = mod_ES0$b, lower = mod_ES0$ci.lb, upper = mod_ES0$ci.ub)
    return(df)
}


# using dplyr to form data frame
MA_CVR_ES <- lapply(LeaveOneOut_effectsize, function(x) est.func(x)) %>%
    bind_rows %>%
    mutate(left_out = levels(dat$Study_ID))

saveRDS(MA_CVR_ES, , file = here("Rdata", "MA_CVR_ES.rds"))

Used to produce Fig. S5

MA_CVR_ES <- readRDS(here("Rdata", "MA_CVR_ES.rds"))

# telling ggplot to stop reordering factors
MA_CVR_ES$left_out <- as.factor(MA_CVR_ES$left_out)
MA_CVR_ES$left_out <- factor(MA_CVR_ES$left_out, levels = MA_CVR_ES$left_out)

# plotting
leaveoneout_ES <- ggplot(MA_CVR_ES) + geom_hline(yintercept = 0, lty = 2, lwd = 1) +
    geom_hline(yintercept = mod_ES0$ci.lb, lty = 3, lwd = 0.75, colour = "black") +
    geom_hline(yintercept = mod_ES0$b, lty = 1, lwd = 0.75, colour = "black") + geom_hline(yintercept = mod_ES0$ci.ub,
    lty = 3, lwd = 0.75, colour = "black") + geom_pointrange(aes(x = left_out, y = est,
    ymin = lower, ymax = upper)) + xlab("Study left out") + ylab("lnRR, 95% CI") +
    coord_flip() + theme(panel.grid.minor = element_blank()) + theme_bw() + theme(panel.grid.major = element_blank()) +
    theme(panel.grid.minor.x = element_blank()) + theme(axis.text.y = element_text(size = 6))

leaveoneout_ES

dat$Study_ID <- as.integer(dat$Study_ID)

Fig. S5 Leave-one-group-out analysis showing meta-analytic mean and 95% CI when each individual study is removed from the data set.

Using SMD

We re-ran the interaction of environmental enrichment x stress meta-analytic model using standardised mean difference (SMD) instead of lnRR

mod_ES0a <- rma.mv(yi = SMD_ESa, V = VCV_ESa, random = list(~1 | Study_ID, ~1 | ES_ID,
    ~1 | Strain), test = "t", data = dat)
summary(mod_ES0a)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##    logLik   Deviance        AIC        BIC       AICc 
## -126.0571   252.1141   260.1141   270.1576   260.5793   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.4653  0.6821     30     no  Study_ID 
## sigma^2.2  0.3698  0.6081     92     no     ES_ID 
## sigma^2.3  0.0000  0.0002      6     no    Strain 
## 
## Test for Heterogeneity:
## Q(df = 91) = 257.4673, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.6880  0.1763  3.9017  91  0.0002  0.3377  1.0382  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES0a)
##     I2_total  I2_Study_ID     I2_ES_ID    I2_Strain 
## 6.657130e-01 3.709364e-01 2.947766e-01 3.351907e-08

Risk of Bias

Including if the study was randomised as a moderator and conducting a pair-wise contrast

mod_randomised_ES <- rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~ROB_randomisation -
    1, random = list(~1 | Study_ID, ~1 | ES_ID, ~1 | Strain), test = "t", data = dat)

summary(mod_randomised_ES)
r2_ml(mod_randomised_ES)
contra_mod_randomised_ES <- contrast_fun(data = dat, response = lnRR_ESa, moderator = ROB_randomisation,
    VCV = VCV_ES)
res_table_mod_randomised_ES <- get_estimate(model = mod_randomised_ES, contra = contra_mod_randomised_ES,
    moderator = ROB_randomisation)

res_table_mod_randomised_ES
## # A tibble: 3 x 7
##   Levels      Estimate Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>          <dbl>    <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Unclear       0.0467  -0.106     0.200 0.546     -0.434    0.527
## 2 Yes           0.200    0.0503    0.350 0.00946   -0.279    0.680
## 3 Unclear-Yes   0.154   -0.0200    0.327 0.0821    -0.333    0.641

Including if the study used blinding and conducting a pair-wise contrast

mod_blinding_ES <- rma.mv(yi = lnRR_ESa, V = VCV_ES, mod = ~ROB_blinding - 1, random = list(~1 |
    Study_ID, ~1 | ES_ID, ~1 | Strain), test = "t", data = dat)

summary(mod_blinding_ES)
r2_ml(mod_blinding_ES)
contra_mod_blinding_ES <- contrast_fun(data = dat, response = lnRR_ESa, moderator = ROB_blinding,
    VCV = VCV_ES)
res_table_mod_blinding_ES <- get_estimate(model = mod_blinding_ES, contra = contra_mod_blinding_ES,
    moderator = ROB_blinding)

res_table_mod_blinding_ES
## # A tibble: 3 x 7
##   Levels      Estimate  Lower_CI Upper_CI P_value Lower_PI Upper_PI
##   <chr>          <dbl>     <dbl>    <dbl>   <dbl>    <dbl>    <dbl>
## 1 Unclear       0.158  -0.000309    0.316  0.0504   -0.364    0.680
## 2 Yes           0.0444 -0.178       0.267  0.693    -0.500    0.589
## 3 Unclear-Yes  -0.114  -0.343       0.115  0.327    -0.661    0.434

‘Pairwise’ effect sizes

We conducted five ‘meta-analyses on ’pair-wise’ comparisons using lnRR between the treatments and control: \[ \ln{\text{RR}} = \ln (M_{\text{EC}}/M_{\text{CC}}), \ln (M_{\text{CS}}/M_{\text{CC}}), \ln (M_{\text{ES}}/M_{\text{CC}}), \ln (M_{\text{ES}}/M_{\text{CS}}) \ln (M_{\text{ES}}/M_{\text{EC}}), \]

Enrichment relative to control

\[ \ln{\text{RR}} = \ln (M_{\text{EC}}/M_{\text{CC}}) \]

VCV_E20 <- impute_covariance_matrix(vi = dat$lnRRV_E2, cluster = dat$Study_ID, r = 0.5)

mod_E20 <- rma.mv(yi = lnRR_E2a, V = VCV_E20, random = list(~1 | Study_ID, ~1 | Strain,
    ~1 | ES_ID), test = "t", data = dat, control = list(optimizer = "optim", optmethod = "Nelder-Mead"))

summary(mod_E20)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -7.3235   14.6470   22.6470   32.6904   23.1121   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0037  0.0611     30     no  Study_ID 
## sigma^2.2  0.0000  0.0000      6     no    Strain 
## sigma^2.3  0.0281  0.1675     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 475.8327, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.1066  0.0291  3.6655  91  0.0004  0.0489  0.1644  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E20)
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 8.610789e-01 1.011724e-01 2.607945e-09 7.599065e-01
orchard_plot(mod_E20, mod = "Int", xlab = "lnRR")

Stress relative to control

\[ \ln{\text{RR}} = \ln (M_{\text{CS}}/M_{\text{CC}}) \]

VCV_S20 <- impute_covariance_matrix(vi = dat$lnRRV_S2, cluster = dat$Study_ID, r = 0.5)

mod_S20 <- rma.mv(yi = lnRR_S2a, V = VCV_S20, random = list(~1 | Study_ID, ~1 | Strain,
    ~1 | ES_ID), test = "t", data = dat)

summary(mod_S20)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -52.3561  104.7122  112.7122  122.7557  113.1773   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0323  0.1797     30     no  Study_ID 
## sigma^2.2  0.0000  0.0000      6     no    Strain 
## sigma^2.3  0.0798  0.2824     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 1003.0694, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub 
##  -0.1846  0.0522  -3.5360  91  0.0006  -0.2882  -0.0809  *** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S20)
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 9.489604e-01 2.734220e-01 9.879730e-10 6.755384e-01
orchard_plot(mod_S20, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to control

\[ \ln{\text{RR}} = \ln (M_{\text{ES}}/M_{\text{CC}}) \]

VCV_ES20 <- impute_covariance_matrix(vi = dat$lnRRV_ES2, cluster = dat$Study_ID,
    r = 0.5)

mod_ES20 <- rma.mv(yi = lnRR_ES2a, V = VCV_ES20, random = list(~1 | Study_ID, ~1 |
    Strain, ~1 | ES_ID), test = "t", data = dat)
summary(mod_ES20)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -10.3625   20.7250   28.7250   38.7684   29.1901   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0039  0.0625     30     no  Study_ID 
## sigma^2.2  0.0014  0.0377      6     no    Strain 
## sigma^2.3  0.0227  0.1508     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 402.2656, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.0801  0.0389  2.0594  91  0.0423  0.0028  0.1573  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_ES20)
##    I2_total I2_Study_ID   I2_Strain    I2_ES_ID 
##  0.81513970  0.11355557  0.04132363  0.66026050
orchard_plot(mod_ES20, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to stress

\[ \ln{\text{RR}} = \ln (M_{\text{ES}}/M_{\text{CS}}) \]

VCV_E30 <- impute_covariance_matrix(vi = dat$lnRRV_E3, cluster = dat$Study_ID, r = 0.5)

mod_E30 <- rma.mv(yi = lnRR_E3a, V = VCV_E30, random = list(~1 | Study_ID, ~1 | Strain,
    ~1 | ES_ID), test = "t", data = dat)
summary(mod_E30)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
## -46.3447   92.6895  100.6895  110.7329  101.1546   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0235  0.1532     30     no  Study_ID 
## sigma^2.2  0.0263  0.1623      6     no    Strain 
## sigma^2.3  0.0543  0.2331     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 790.0249, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub 
##   0.2465  0.1011  2.4389  91  0.0167  0.0457  0.4472  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_E30)
##    I2_total I2_Study_ID   I2_Strain    I2_ES_ID 
##   0.9456920   0.2132063   0.2391809   0.4933048
orchard_plot(mod_E30, mod = "Int", xlab = "lnRR")

Enrichment + stress relative to enrichment

\[ \ln{\text{RR}} = \ln (M_{\text{ES}}/M_{\text{EC}}) \]

VCV_S30 <- impute_covariance_matrix(vi = dat$lnRRV_S3, cluster = dat$Study_ID, r = 0.5)

mod_S30 <- rma.mv(yi = lnRR_S3a, V = VCV_S30, random = list(~1 | Study_ID, ~1 | Strain,
    ~1 | ES_ID), test = "t", data = dat, control = list(optimizer = "optim", optmethod = "Nelder-Mead"))
summary(mod_S30)
## 
## Multivariate Meta-Analysis Model (k = 92; method: REML)
## 
##   logLik  Deviance       AIC       BIC      AICc 
##  -6.8788   13.7576   21.7576   31.8011   22.2228   
## 
## Variance Components:
## 
##             estim    sqrt  nlvls  fixed    factor 
## sigma^2.1  0.0000  0.0000     30     no  Study_ID 
## sigma^2.2  0.0009  0.0292      6     no    Strain 
## sigma^2.3  0.0276  0.1662     92     no     ES_ID 
## 
## Test for Heterogeneity:
## Q(df = 91) = 540.3522, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb   ci.ub 
##  -0.0087  0.0342  -0.2552  91  0.7992  -0.0766  0.0592    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
i2_ml(mod_S30)
##     I2_total  I2_Study_ID    I2_Strain     I2_ES_ID 
## 8.415428e-01 5.192043e-09 2.515933e-02 8.163835e-01
orchard_plot(mod_S30, mod = "Int", xlab = "lnRR")

Figures

Panel of ‘focal’ ES and ‘pairwise’ ES orchard plots

Used to produce Fig. 3

mod_list1 <- list(mod_E0, mod_S0, mod_ES0)

mod_res1 <- lapply(mod_list1, function(x) mod_results(x, mod = "Int"))

merged1 <- submerge(mod_res1[[3]], mod_res1[[2]],  mod_res1[[1]], mix = T)
merged1$mod_table$name <- factor(merged1$mod_table$name, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3"), 
    labels = rev(c("Enrichment ME", "Stress ME", "Interaction")))

merged1$data$moderator <- factor(merged1$data$moderator, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3"), 
    labels = rev(c("Enrichment ME", "Stress ME", "Interaction")))

orchard1<- orchard_plot(merged1, mod = "Int", xlab = "lnRR", angle = 0) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals 
  xlim(-2,4.5) +
  geom_point(aes(fill = name),  size = 4, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling +
  scale_colour_manual(values = c("#00AEEF","#00A651","#ED1C24"))+ # change colours
  scale_fill_manual(values=c("#00AEEF","#00A651","#ED1C24"))+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 
mod_list2 <- list(mod_S30, mod_E30, mod_ES20, mod_S20, mod_E20) #rearranged the order so that it matches intext results

mod_res2 <- lapply(mod_list2, function(x) mod_results(x, mod = "Int"))

merged2 <- submerge(mod_res2[[1]], mod_res2[[2]],  mod_res2[[3]], mod_res2[[4]],  mod_res2[[5]], mix = T)

merged2$mod_table$name <- factor(merged2$mod_table$name, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3", "Intrcpt4", "Intrcpt5"), 
    labels = rev(c("EC/CC", "CS/CC", "ES/CC", "ES/CS", "ES/EC")))

merged2$data$moderator <- factor(merged2$data$moderator, levels = c("Intrcpt1", 
    "Intrcpt2", "Intrcpt3", "Intrcpt4", "Intrcpt5"), 
    labels = rev(c("EC/CC", "CS/CC", "ES/CC", "ES/CS", "ES/EC")))

orchard2 <- orchard_plot(merged2, mod = "Int", xlab = "lnRR", angle = 0) + 
  geom_errorbarh(aes(xmin = lowerPR, xmax = upperPR), height = 0, show.legend = FALSE, size = 1.1, alpha = 0.5) + # prediction intervals
  geom_errorbarh(aes(xmin = lowerCL, xmax = upperCL), height = 0.05, show.legend = FALSE, size = 2) + # confidence intervals 
  xlim(-2,4.5) +
  geom_point(aes(fill = name),  size = 4, shape = 21)+ # mean estimate
  scale_size_continuous(range = c(1, 7))+ # change point scaling
  scale_colour_manual(values = c("#7B81BE","#D7DF23","#F37158","#75CBF2","#97D2B4"))+ # change colours
  scale_fill_manual(values=c("#7B81BE","#D7DF23","#F37158","#75CBF2","#97D2B4"))+
  theme(panel.border = element_rect(colour = "black", fill=NA, size=1.3), # border around the plot
        text = element_text(size = 15), # change font sizes
        legend.title = element_text(size = 10),
        legend.text = element_text(size = 10)) 
p1 <- orchard1 + orchard2 + plot_annotation(tag_levels = "A")
p1

# saved as PDF: 6 x 15 inches

Fig. 3 Orchard plots showing the eight meta-analytic models. (A) main effects of enrichment and stress, and interaction of environmental enrichment and stress, (B) ‘pairwise’ comparisons between treatments and controls. Thick black lines = 95% CI, thin black lines = 95 % PI.

Panel of meta-regressions

Environmental enrichment

Used to produce Fig. 4

# Enrichment
E_mod <- (LvsM_E + Learning_E + Reinforcement_E)/(Age_E + Exercise_E + Social_E) +
    plot_annotation(tag_levels = "A")

E_mod

# saved as pdf 10 x 15 inches

Fig. 4 Orchard plots showing the six different meta-regressions on the main effect of environmental enrichment on learning and memory. (A) learning versus memory response, (B) the type of assay, (C) the type of reinforcement, (D) the age at environmental enrichment, (E) type of manipulation of exercise during enrichment, (F) manipulation of the social environment during enrichment.

Stress

Used to produce Fig. 5

S_mod <- (LvsM_S + Learning_S + Reinforcement_S)/(Age_S + Stressor + Duration_S) +
    plot_annotation(tag_levels = "A")

S_mod

# saved as pdf 10 x 15 inches

Fig. 5 Orchard plots showing the six different meta-regressions on the main effect of stress on learning and memory. (A) learning versus memory response, (B) the type of assay, (C) the type of reinforcement, (D) the age at stress, (E) the type of stressor (MS = maternal separation), (F) chronic or acute stress.

Interaction

Used to produce Fig. 6

ES_mod <- plot_grid(LvsM_ES, Learning_ES, Reinforcement_ES, Age_enrichment_ES, Age_stress_ES,
    Order_ES, Exercise_ES, Social_ES, Stressor_ES, Duration_ES, labels = "AUTO",
    ncol = 5)

ES_mod

# saved as 10 x 25 inches

Fig. 6 Orchard plots showing the 10 different meta-regressions of moderators on the interaction between environmental enrichment and stress learning and memory. (A) learning versus memory response, (B) the type of assay, (C) the type of reinforcement used, (D) the age at environmental enrichment, (E) the age at stress, (F) the order of treatment exposure, (G) if enrichment involved a manipulation of exercise, (H) manipulation of the social environment during enrichment, (I) the type of stressor, (F) stress was chronic or acute.

Panel of funnel plots

Used to produce Fig. 7

# EE

pdf(NULL)
dev.control(displaylist = "enable")
par(mar = c(4, 4, 0.1, 0))
A <- funnel(mod_Sfm, xlab = "Residuals (lnRR)", ylab = "Standard Error", xlim = c(-2,
    2), ylim = c(0, 1.05))
A <- recordPlot()
invisible(dev.off())

# Stress

pdf(NULL)
dev.control(displaylist = "enable")
par(mar = c(4, 4, 0.1, 0))
B <- funnel(mod_Sfm, xlab = "Residuals (lnRR)", ylab = "Standard Error", xlim = c(-2,
    2), ylim = c(0, 1.05))
B <- recordPlot()
invisible(dev.off())

# Interaction
pdf(NULL)
dev.control(displaylist = "enable")
par(mar = c(4, 4, 0.1, 0))
C <- funnel(mod_ESfm, xlab = "Residuals (lnRR)", ylab = "Standard Error", xlim = c(-2,
    2), ylim = c(0, 1.05))
C <- recordPlot()
invisible(dev.off())

# putting together
ggdraw(A) + ggdraw(B) + ggdraw(C) + plot_annotation(tag_levels = "A")

# png(file = here('figs', 'Fig7_Funnels.png'))

# dev.off()
knitr::include_graphics(here("figs", "funnels.png"))

Fig. 7 Funnel plots of the standard error and residuals (lnRR) from the full models. (A) environmental enrichment main effect, (B) stress main effect, (C) environmental enrichment x stress interaction.

Software and package versions

sessionInfo() %>%
    pander()

R version 4.1.0 (2021-05-18)

Platform: x86_64-apple-darwin17.0 (64-bit)

locale: en_AU.UTF-8||en_AU.UTF-8||en_AU.UTF-8||C||en_AU.UTF-8||en_AU.UTF-8

attached base packages: grid, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: formatR(v.1.11), pander(v.0.6.4), gridGraphics(v.0.5-1), png(v.0.1-7), cowplot(v.1.1.1), ggthemr(v.1.1.0), ggalluvial(v.0.12.3), visdat(v.0.5.3), ggsignif(v.0.6.2), networkD3(v.0.4), GoodmanKruskal(v.0.0.3), patchwork(v.1.1.1), MuMIn(v.1.43.17), orchaRd(v.0.0.0.9000), clubSandwich(v.0.5.3), metafor(v.3.0-2), Matrix(v.1.3-3), here(v.1.0.1), forcats(v.0.5.1), stringr(v.1.4.0), dplyr(v.1.0.6), purrr(v.0.3.4), readr(v.1.4.0), tidyr(v.1.1.3), tibble(v.3.1.2), ggplot2(v.3.3.3) and tidyverse(v.1.3.1)

loaded via a namespace (and not attached): nlme(v.3.1-152), fs(v.1.5.0), lubridate(v.1.7.10), RColorBrewer(v.1.1-2), httr(v.1.4.2), rprojroot(v.2.0.2), tools(v.4.1.0), backports(v.1.2.1), utf8(v.1.2.1), R6(v.2.5.0), vipor(v.0.4.5), DBI(v.1.1.1), colorspace(v.2.0-1), withr(v.2.4.2), tidyselect(v.1.1.1), compiler(v.4.1.0), cli(v.2.5.0), rvest(v.1.0.0), pacman(v.0.5.1), xml2(v.1.3.2), sandwich(v.3.0-1), labeling(v.0.4.2), bookdown(v.0.22), scales(v.1.1.1), digest(v.0.6.27), rmarkdown(v.2.8), pkgconfig(v.2.0.3), htmltools(v.0.5.1.1), highr(v.0.9), dbplyr(v.2.1.1), htmlwidgets(v.1.5.3), rlang(v.0.4.11), readxl(v.1.3.1), rstudioapi(v.0.13), farver(v.2.1.0), generics(v.0.1.0), zoo(v.1.8-9), jsonlite(v.1.7.2), magrittr(v.2.0.1), ggbeeswarm(v.0.6.0), Rcpp(v.1.0.6), munsell(v.0.5.0), fansi(v.0.4.2), lifecycle(v.1.0.0), stringi(v.1.6.2), yaml(v.2.2.1), mathjaxr(v.1.4-0), crayon(v.1.4.1), lattice(v.0.20-44), haven(v.2.4.1), hms(v.1.1.0), knitr(v.1.33), pillar(v.1.6.1), igraph(v.1.2.6), stats4(v.4.1.0), reprex(v.2.0.0), glue(v.1.4.2), evaluate(v.0.14), modelr(v.0.1.8), vctrs(v.0.3.8), rmdformats(v.1.0.2), cellranger(v.1.1.0), gtable(v.0.3.0), assertthat(v.0.2.1), xfun(v.0.23), broom(v.0.7.6), beeswarm(v.0.4.0) and ellipsis(v.0.3.2)

LS0tCnRpdGxlOiAiVGhlIHJlbGF0aXZlIGJlbmVmaXRzIG9mIGVudmlyb25tZW50YWwgZW5yaWNobWVudCBvbiBsZWFybmluZyBhbmQgbWVtb3J5IGFyZSBncmVhdGVyIHdoZW4gc3RyZXNzZWQ6IGEgbWV0YS1hbmFseXNpcyBvZiBpbnRlcmFjdGlvbnMgaW4gcm9kZW50cyIKYXV0aG9yczogIkVyaW4gTCBNYWNhcnRuZXksIE1hbGdvcnphdGEgTGFnaXN6LCBTaGluaWNoaSBOYWthZ2F3YSIKc3VidGl0bGU6IFN1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzMKb3V0cHV0OiAKICAgIAogICAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICAgIHRvY19kZXB0aDogNAplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCm1lc3NhZ2UgPSBGQUxTRSwKd2FybmluZyA9IEZBTFNFLAojY2FjaGUgPSBUUlVFLCAKdGlkeSA9IFRSVUUsIAplY2hvID0gVFJVRQopCgpybShsaXN0ID0gbHMoKSkKYGBgCgojIFNldHRpbmctdXAgey50YWJzZXR9CgojIyBMb2FkaW5nIHBhY2thZ2VzCgpgYGB7ciwgY2FjaGUgPSBGQUxTRX0KCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoJ01pa2F0YS1Qcm9qZWN0L2dndGhlbXInLCBmb3JjZSA9IFRSVUUpIAoKcGFjbWFuOjpwX2xvYWQodGlkeXZlcnNlLCAKICAgICAgICAgICAgICAgaGVyZSwKICAgICAgICAgICAgICAgbWV0YWZvciwKICAgICAgICAgICAgICAgY2x1YlNhbmR3aWNoLAogICAgICAgICAgICAgICBvcmNoYVJkLCAKICAgICAgICAgICAgICAgTXVNSW4sCiAgICAgICAgICAgICAgIHBhdGNod29yaywKICAgICAgICAgICAgICAgR29vZG1hbktydXNrYWwsCiAgICAgICAgICAgICAgIG5ldHdvcmtEMywKICAgICAgICAgICAgICAgZ2dwbG90MiwKICAgICAgICAgICAgICAgZ2dzaWduaWYsCiAgICAgICAgICAgICAgIHZpc2RhdCwKICAgICAgICAgICAgICAgZ2dhbGx1dmlhbCwKICAgICAgICAgICAgICAgZ2d0aGVtciwgCiAgICAgICAgICAgICAgIGNvd3Bsb3QsCiAgICAgICAgICAgICAgIGdyRGV2aWNlcywKICAgICAgICAgICAgICAgcG5nLAogICAgICAgICAgICAgICBncmlkLAogICAgICAgICAgICAgICBncmlkR3JhcGhpY3MsCiAgICAgICAgICAgICAgIHBhbmRlciwKICAgICAgICAgICAgICAgZm9ybWF0UikKIyBuZWVkZWQgZm9yIG1vZGVsIHNlbGVjdGlvbiB1c2luZyBNdU1JbiB3aXRoaW4gbWV0YWZvcgpldmFsKG1ldGFmb3I6OjouTXVNSW4pCgpgYGAKCiMjIExvYWRpbmcgZGF0YSBhbmQgZnVuY3Rpb25zClRoaXMgbG9hZHMgdGhlIHVucHJvY2Vzc2VkIGRhdGEgZmlsZSBhbmQgY3VzdG9tIGZ1bmN0aW9ucyBpbmNsdWRpbmcKCi0gY2FsY3VsYXRpbmcgJ2ZvY2FsJyBlZmZlY3Qgc2l6ZXMgYW5kIHZhcmlhbmNlIGZvciBsblJSIGFuZCBTTUQ6IGBlZmZlY3Rfc2V0YAotIGNhbGN1bGF0aW5nICdwYWlyd2lzZScgY29tcGFyaXNvbnMgKGxuUlIpIGFuZCB2YXJpYW5jZTogYGVmZmVjdF9zZXQyYAotIGNhbGN1bGF0aW5nIHBhaXItd2lzZSBjb250cmFzdHMgYmV0d2VlbiBtb2RlcmF0b3JzOiBgY29udHJhc3RfZnVuYAoKYGBge3IsIGNhY2hlID0gRkFMU0V9CmRhdCA8LSByZWFkX2NzdihoZXJlKCJEYXRhIiwiRGF0YV9yYXcuY3N2IikpCiMgTG9hZCBjdXN0b20gZnVuY3Rpb24gdG8gZXh0cmFjdCBkYXRhIApzb3VyY2UoaGVyZSgiUi9GdW5jdGlvbnMuUiIpKSAKYGBgCgojIyBEYXRhIG9yZ2FuaXNhdGlvbgotIHJlbW92aW5nIHN0dWR5IChXYW5nIGV0IGFsXzIwMjApIHdpdGggbmVnYXRpdmUgdmFsdWVzIGFzIGxuUlIgY2Fubm90IGJlIGNhbGN1bGF0ZWQgd2l0aCBuZWdhdGl2ZSB2YWx1ZXMKLSByb3VuZGluZyBkb3duIHNhbXBsZSBzaXplcyB0aGF0IGFyZSByZXBvcnRlZCBhcyBkZWNpbWFscyBkdWUgdG8gYXZlcmFnaW5nIG4gYWNyb3NzIHRyZWF0bWVudHMKLSBnZXR0aW5nIGVmZmVjdCBzaXplcyBmcm9tIGZ1bmN0aW9uCi0gJ2ZsaXBwaW5nJyBlZmZlY3Qgc2l6ZXMgc28gdGhhdCBhbGwgZWZmZWN0IHNpemVzIGFyZSBoaWdoZXIgdmFsdWVzID0gaW5kaXZpZHVhbHMgZG8gYmV0dGVyIGluIGNvZ25pdGl2ZSBhc3NheXMKLSBhc3NpZ25pbmcgaHVtYW4gcmVhZGFibGUgdGVybXMsIGFuZCBjcmVhdGluZyBWQ1Ygb2YgdmFyaWFuY2UgCgpgYGB7cn0KCiMgcmVtb3Zpbmcgc3R1ZHkgd2l0aCBuZWdhdGl2ZSB2YWx1ZXMgYXMgdGhlc2UgYXJlIHVuYWJsZSB0byBiZSB1c2VkIGZvciBsblJSCmRhdCA8LSBkcm9wbGV2ZWxzKGRhdFshZGF0JEZpcnN0X2F1dGhvciA9PSAnV2FuZycsXSkKCiNyb3VuZGluZyBkb3duIHNhbXBsZSBzaXplcwpkYXQkQ0NfbiA8LSBmbG9vcihkYXQkQ0NfbikKZGF0JEVDX24gPC0gZmxvb3IoZGF0JEVDX24pCmRhdCRDU19uIDwtIGZsb29yKGRhdCRDU19uKQpkYXQkRVNfbiA8LSBmbG9vcihkYXQkQ1NfbikKCiMgJ0ZvY2FsJyBlZmZlY3Rfc2l6ZSAKZWZmZWN0X3NpemUgPC0gd2l0aChkYXQsIG1hcHBseShlZmZlY3Rfc2V0LCAKICAgICAgICAgICAgICAgICAgICAgIENDX24gLAogICAgICAgICAgICAgICAgICAgICAgQ0NfbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICBDQ19TRCwKICAgICAgICAgICAgICAgICAgICAgIEVDX24sIAogICAgICAgICAgICAgICAgICAgICAgRUNfbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICBFQ19TRCwKICAgICAgICAgICAgICAgICAgICAgIENTX24sIAogICAgICAgICAgICAgICAgICAgICAgQ1NfbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICBDU19TRCwKICAgICAgICAgICAgICAgICAgICAgIEVTX24sIAogICAgICAgICAgICAgICAgICAgICAgRVNfbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICBFU19TRCwKICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQgPSBSZXNwb25zZV9wZXJjZW50LAogICAgICAgICAgICAgICAgICAgICAgU0lNUExJRlkgPSBGQUxTRSkpCmVmZmVjdF9zaXplIDwtIG1hcF9kZnIoZWZmZWN0X3NpemUsIEkpCgojICdQYWlyd2lzZScgZWZmZWN0IHNpemUKIGVmZmVjdF9zaXplMiA8LSB3aXRoKGRhdCwgbWFwcGx5KGVmZmVjdF9zZXQyLCAKICAgICAgICAgICAgICAgICAgICAgIENDX24gLAogICAgICAgICAgICAgICAgICAgICAgQ0NfbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICBDQ19TRCwKICAgICAgICAgICAgICAgICAgICAgIEVDX24sIAogICAgICAgICAgICAgICAgICAgICAgRUNfbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICBFQ19TRCwKICAgICAgICAgICAgICAgICAgICAgIENTX24sIAogICAgICAgICAgICAgICAgICAgICAgQ1NfbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICBDU19TRCwKICAgICAgICAgICAgICAgICAgICAgIEVTX24sIAogICAgICAgICAgICAgICAgICAgICAgRVNfbWVhbiwgCiAgICAgICAgICAgICAgICAgICAgICBFU19TRCwKICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQgPSBSZXNwb25zZV9wZXJjZW50LAogICAgICAgICAgICAgICAgICAgICAgU0lNUExJRlkgPSBGQUxTRSkpCmVmZmVjdF9zaXplMiA8LSBtYXBfZGZyKGVmZmVjdF9zaXplMiwgSSkKCmZ1bGxfaW5mbyA8LSB3aGljaChjb21wbGV0ZS5jYXNlcyhlZmZlY3Rfc2l6ZSkgPT0gVFJVRSkKCiMgYWRkaW5nIGVmZmVjdCBzaXplcyBhcyBjb2x1bW4KZGF0IDwtIGJpbmRfY29scyhkYXQsIGVmZmVjdF9zaXplLCBlZmZlY3Rfc2l6ZTIpCmRhdCA8LSBkYXRbZnVsbF9pbmZvLCBdCgojRmxpcHBpbmcgJ2xvd2VyIGlzIGJldHRlcicgdG8gJ2hpZ2hlciBpcyBiZXR0ZXInIGVmZmVjdCBzaXplcwojZmxpcHBpbmcgbG5SUiBmb3IgdmFsdWVzIHdoZXJlIGhpZ2hlciA9IHdvcnNlCmRhdCRsblJSX0VhIDwtIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRsblJSX0UqLTEsaWZlbHNlKGlzLm5hKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24pID09IFRSVUUsIE5BLCBkYXQkbG5SUl9FKSkKIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCmRhdCRsblJSX1NhICA8LSBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9TKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JGxuUlJfUykpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkbG5SUl9FU2EgPC0gIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRsblJSX0VTKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JGxuUlJfRVMpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKI2ZsaXBwaW5nICdwdXJlIGVmZmVjdCBzaXplcycKZGF0JGxuUlJfRTJhIDwtIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRsblJSX0UyKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JGxuUlJfRTIpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JGxuUlJfUzJhICA8LSBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9TMiotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX1MyKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCmRhdCRsblJSX0VTMmEgPC0gIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRsblJSX0VTMiotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX0VTMikpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkbG5SUl9FM2EgPC0gIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRsblJSX0UzKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JGxuUlJfRTMpKSAjIGN1cnJlbnRseSBOQXN3aGljaCBjYXVzZXMgZXJyb3IKZGF0JGxuUlJfUzNhIDwtICBpZmVsc2UoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbiA9PSAyLCBkYXQkbG5SUl9TMyotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRsblJSX1MzKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCgojZmxpcHBpbmcgU01ECmRhdCRTTURfRWEgPC0gaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JFNNRF9FKi0xLGlmZWxzZShpcy5uYShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uKSA9PSBUUlVFLCBOQSwgZGF0JFNNRF9FKSkgIyBjdXJyZW50bHkgTkFzd2hpY2ggY2F1c2VzIGVycm9yCmRhdCRTTURfU2EgIDwtIGlmZWxzZShkYXQkUmVzcG9uc2VfZGlyZWN0aW9uID09IDIsIGRhdCRTTURfUyotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRTTURfUykpICMgY3VycmVudGx5IE5Bc3doaWNoIGNhdXNlcyBlcnJvcgpkYXQkU01EX0VTYSA8LSAgaWZlbHNlKGRhdCRSZXNwb25zZV9kaXJlY3Rpb24gPT0gMiwgZGF0JFNNRF9FUyotMSxpZmVsc2UoaXMubmEoZGF0JFJlc3BvbnNlX2RpcmVjdGlvbikgPT0gVFJVRSwgTkEsIGRhdCRTTURfRVMpKQoKIyBhc3NpZ25pbmcgaHVtYW4gcmVhZGFibGUgdGVybXMKZGF0IDwtIGRhdCAlPiUgbXV0YXRlKFR5cGVfYXNzYXkgPSBjYXNlX3doZW4oVHlwZV9hc3NheSA9PSAxIH4gIkhhYml0dWF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9hc3NheSA9PSAyIH4gIkNvbmRpdGlvbmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfYXNzYXkgPT0gMyB+ICJSZWNvZ25pdGlvbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX2Fzc2F5ID09IDQgfiAiVW5jbGVhciIpLAogICAgICAgICAgICAgICAgICAgICAgTGVhcm5pbmdfdnNfbWVtb3J5ID0gY2FzZV93aGVuKExlYXJuaW5nX3ZzX21lbW9yeSA9PSAxIH4gIkxlYXJuaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFybmluZ192c19tZW1vcnkgPT0gMiB+ICJNZW1vcnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFybmluZ192c19tZW1vcnkgPT0gMyB+ICJIYWJpdHVhdGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgVHlwZV9yZWluZm9yY2VtZW50ID0gY2FzZV93aGVuKFR5cGVfcmVpbmZvcmNlbWVudD09IDEgfiJBcHBldGl0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9yZWluZm9yY2VtZW50PT0gMiB+ICJBdmVyc2l2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfcmVpbmZvcmNlbWVudD09IDMgfiAiTm90IGFwcGxpY2FibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3JlaW5mb3JjZW1lbnQ9PSA0IH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID0gY2FzZV93aGVuKFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDEgfiAiRGVuc2l0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSAyIH4gIlNjZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDMgfiAiU2hvY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gNCB+ICJFeGVydGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSA1IH4gIlJlc3RyYWludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSA2IH4gIk1TIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDcgfiAiQ2lyY2FkaWFuIHJoeXRobSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX3N0cmVzc19leHBvc3VyZSA9PSA4IH4gIk5vaXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfc3RyZXNzX2V4cG9zdXJlID09IDkgfiAiT3RoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gMTAgfiAiQ29tYmluYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgPT0gMTEgfiAidW5jbGVhciIpLCAKICAgICAgICAgICAgICAgICAgICAgIEFnZV9zdHJlc3NfZXhwb3N1cmUgPSBjYXNlX3doZW4oQWdlX3N0cmVzc19leHBvc3VyZSA9PSAxIH4gIlByZW5hdGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX3N0cmVzc19leHBvc3VyZSA9PSAyIH4gIkVhcmx5IHBvc3RuYXRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9zdHJlc3NfZXhwb3N1cmUgPT0gMyB+ICJBZG9sZXNjZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX3N0cmVzc19leHBvc3VyZSA9PSA0IH4gIkFkdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX3N0cmVzc19leHBvc3VyZSA9PSA1IH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIFN0cmVzc19kdXJhdGlvbiA9IGNhc2Vfd2hlbihTdHJlc3NfZHVyYXRpb24gPT0gMSB+ICJBY3V0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZXNzX2R1cmF0aW9uID09IDIgfiAiQ2hyb25pYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZXNzX2R1cmF0aW9uID09IDMgfiAiSW50ZXJtaXR0ZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlc3NfZHVyYXRpb24gPT0gNCB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBFRV9zb2NpYWwgPSBjYXNlX3doZW4oRUVfc29jaWFsID09IDEgfiAiU29jaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRV9zb2NpYWw9PSAyIH4gIk5vbi1zb2NpYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRV9zb2NpYWwgPT0gMyB+ICJVbmNsZWFyIiksIAogICAgICAgICAgICAgICAgICAgICAgRUVfZXhlcmNpc2UgPSBjYXNlX3doZW4oRUVfZXhlcmNpc2UgPT0gMSB+ICJFeGVyY2lzZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUVfZXhlcmNpc2UgPT0gMiB+ICJObyBleGVyY2lzZSIpLAogICAgICAgICAgICAgICAgICAgICAgQWdlX0VFX2V4cG9zdXJlID0gY2FzZV93aGVuKEFnZV9FRV9leHBvc3VyZSA9PSAxIH4gIlByZW5hdGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX0VFX2V4cG9zdXJlID09IDIgfiAiRWFybHkgcG9zdG5hdGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2VfRUVfZXhwb3N1cmUgPT0gMyB+ICJBZG9sZXNjZW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdlX0VFX2V4cG9zdXJlID09IDQgfiAiQWR1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9FRV9leHBvc3VyZSA9PSA1IH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIEV4cG9zdXJlX29yZGVyID0gY2FzZV93aGVuKEV4cG9zdXJlX29yZGVyID09IDEgfiAiU3RyZXNzIGZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwb3N1cmVfb3JkZXIgPT0gMiB+ICJFbnJpY2htZW50IGZpcnN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwb3N1cmVfb3JkZXIgPT0gMyB+ICJDb25jdXJyZW50bHkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwb3N1cmVfb3JkZXIgPT0gNCB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBBZ2VfYXNzYXkgPSBjYXNlX3doZW4oQWdlX2Fzc2F5ID09IDEgfiAiRWFybHkgcG9zdG5hdGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2VfYXNzYXkgPT0gMiB+ICJBZG9sZXNjZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2VfYXNzYXkgPT0gMyB+ICJBZHVsdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZV9hc3NheSA9PSA0IH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIFNleCA9IGNhc2Vfd2hlbihTZXggPT0gMSB+ICJGZW1hbGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXggPT0gMiB+ICJNYWxlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V4ID09IDMgfiAiTWl4ZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXggPT0gNCB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBUeXBlX0VFX2V4cG9zdXJlID0gY2FzZV93aGVuKFR5cGVfRUVfZXhwb3N1cmUgPT0gMSB+ICJOZXN0aW5nIG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9PSAyIH4gIk9iamVjdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX0VFX2V4cG9zdXJlID09IDMgfiAiQ2FnZSBjb21wbGV4aXR5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVfRUVfZXhwb3N1cmUgPT0gNCB+ICJXaGVlbC90cmFkZW1pbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX0VFX2V4cG9zdXJlID09IDUgfiAiQ29tYmluYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlX0VFX2V4cG9zdXJlID09IDYgfiAiT3RoZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZV9FRV9leHBvc3VyZSA9PSA3IH4gIlVuY2xlYXIiKSwKICAgICAgICAgICAgICAgICAgICAgIFJPQl9ibGluZGluZyA9IGNhc2Vfd2hlbihST0JfYmxpbmRpbmcgPT0gMSB+ICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPQl9ibGluZGluZyA9PSAyIH4gIk5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0JfYmxpbmRpbmcgPT0gMyB+ICJVbmNsZWFyIiksCiAgICAgICAgICAgICAgICAgICAgICBST0JfcmFuZG9taXNhdGlvbiA9IGNhc2Vfd2hlbihST0JfcmFuZG9taXNhdGlvbiA9PSAxIH4gIlllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0JfcmFuZG9taXNhdGlvbiA9PSAyIH4gIk5vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPQl9yYW5kb21pc2F0aW9uID09IDMgfiAiVW5jbGVhciIpKQoKI21ha2luZyB2YXJpYW5jZSBWQ1ZzClZDVl9FIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRsblJSVl9FLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQpWQ1ZfUyA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkbG5SUlZfUywgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKVkNWX0VTIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRsblJSVl9FUywgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKClZDVl9FYSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkU01EVl9FLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQpWQ1ZfU2EgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JFNNRFZfUywgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKVkNWX0VTYSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkU01EVl9FUywgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCiN3cml0ZS5jc3YoZGF0LCBmaWxlID0gaGVyZSgiRGF0YSIsICdEYXRhX3Byb2Nlc3NlZC5jc3YnKSwgcm93Lm5hbWVzID0gVFJVRSkKYGBgCgojIERhdGEgZXhwbG9yYXRpb24KCiMjIEdlbmVyYWwKTnVtYmVyIG9mIGVmZmVjdCBzaXplczoKYGBgIHtyfQojTnVtYmVyIG9mIGVmZmVjdCBzaXplcwpsZW5ndGgodW5pcXVlKGRhdCRFU19JRCkpICAKYGBgCgpOdW1iZXIgb2Ygc3R1ZGllczoKYGBgIHtyfQpsZW5ndGgodW5pcXVlKGRhdCRTdHVkeV9JRCkpCmBgYAoKUHVibGljYXRpb24geWVhciByYW5nZToKYGBgIHtyfQptaW4oZGF0JFllYXJfcHVibGlzaGVkKSAKbWF4KGRhdCRZZWFyX3B1Ymxpc2hlZCkKYGBgCgojIyBWaXN1YWwgb2YgbWlzc2luZyBkYXRhCgpgYGB7ciwgcmVzdWx0cyA9ICdoaWRlJ30KCnBsb3RfbWlzc2luZyA8LSB2aXNfbWlzcyhkYXQpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCB2anVzdCA9IDMpLAogICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKHQgPSAwLjUsIHIgPSAzLCBiID0gMSwgbCA9IDEsIHVuaXQgPSAiY20iKSkgKwogIGdndGl0bGUoIk1pc3NpbmcgZGF0YSBpbiB0aGUgc2VsZWN0ZWQgcHJlZGljdG9ycyIpICNubyBtaXNzaW5nIHZhbHVlcwoKcGxvdF9taXNzaW5nCiN1c2VHb29kbWFuIGFuZCBLcnVza2Fs4oCZcyDPhCBtZWFzdXJlIG9mIGFzc29jaWF0aW9uIGJldHdlZW4gY2F0ZWdvcmljYWwgcHJlZGljdG9yIHZhcmlhYmxlcyAoZnVuY3Rpb24gZnJvbSBwYWNrYWdlIEdvb2RtYW5LcnVza2FsOiBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvR29vZG1hbktydXNrYWwvdmlnbmV0dGVzL0dvb2RtYW5LcnVza2FsLmh0bWwpCiNHS21hdHJpeCA8LSBHS3RhdURhdGFmcmFtZShzdWJzZXQoZGF0LCBzZWxlY3QgPSBjKCJTZXgiLCAiVHlwZV9hc3NheSIsICJMZWFybmluZ192c19tZW1vcnkiLCAjIlR5cGVfcmVpbmZvcmNlbWVudCIsICAiVHlwZV9zdHJlc3NfZXhwb3N1cmUiLCAiQWdlX3N0cmVzc19leHBvc3VyZSIsICJTdHJlc3NfZHVyYXRpb24iLCAjIkVFX3NvY2lhbF9IUiIsICJFRV9leGVyY2lzZSIsICJBZ2VfRUVfZXhwb3N1cmUiLCAiRXhwb3N1cmVfb3JkZXIiLCAiQWdlX2Fzc2F5IikpKQojcGxvdChHS21hdHJpeCkKCiNzaW1wbGUgcGFpcndpc2UgY29udGluZ2VuY3kgdGFibGVzCiMgdGFibGUoZGF0JFR5cGVfYXNzYXksIGRhdCRUeXBlX3JlaW5mb3JjZW1lbnQpIAojIHRhYmxlKGRhdCRBZ2Vfc3RyZXNzX2V4cG9zdXJlLCBkYXQkQWdlX0VFX2V4cG9zdXJlKSAKIyB0YWJsZShkYXQkVHlwZV9zdHJlc3NfZXhwb3N1cmUsIGRhdCRBZ2Vfc3RyZXNzX2V4cG9zdXJlKQojIHRhYmxlKGRhdCRUeXBlX3N0cmVzc19leHBvc3VyZSwgZGF0JEFnZV9hc3NheSkKIyB0YWJsZShkYXQkVHlwZV9zdHJlc3NfZXhwb3N1cmUsIGRhdCRTdHJlc3NfZHVyYXRpb24pCmBgYApWaXN1YWwgb2YgbWlzc2luZyBkYXRhIGZvciBlYWNoIGNvbHVtbi4gTm90ZSB0aGF0IG1vc3QgbWlzc2luZyBkYXRhIGFyZSBmb3IgZGlmZmVyZW50IGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgYXMgcGFwZXJzIGFyZSBvZnRlbiByZXBvcnQgcmVzdWx0cyB1c2luZyBkaWZmZXJlbnQgdHlwZXMgb2YgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyAoaS5lLiwgU0QsIFNFLCBtZWFuLCBtZWRpYW4gZXRjKS4KKkNhbm5vdCByZWR1Y2UgdGV4dCBzaXplIGluIHRoaXMgZmlndXJlKgoKIyMgQWxsdXZpYWwgZGlhZ3JhbXMgey50YWJzZXR9ClNob3dzIHRoZSByZWxhdGlvbnNoaXAvbmVzdGVkbmVzcyBvZiBkaWZmZXJlbnQgZGF0YSBlbGVtZW50cyAodXNlZCB0byBwcm9kdWNlIEZpZy4gMikKCiMjIyBTdWJqZWN0cyBpbmZvOiBzcGVjaWVzLXN0cmFpbi1zZXgKCmBgYHtyLCByZXN1bHRzPSAnaGlkZScsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpmcmVxX0EgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXQkU2V4LCBkYXQkQ29tbW9uX3NwZWNpZXMsIGRhdCRTdHJhaW4pKSAlPiUgcmVuYW1lKFNleCA9IFZhcjEsIFNwZWNpZXMgPSBWYXIyLCBTdHJhaW4gPSBWYXIzKSAjbWFrZSBhIGRhdGEgZnJhbWUgb2YgZnJlcXVlbmNpZXMgZm9yIHRocmVlIHNlbGVjdGVkIHZhcmlhYmxlcwppc19hbGx1dmlhX2Zvcm0oYXMuZGF0YS5mcmFtZShmcmVxX0EpLCBheGVzID0gMTozLCBzaWxlbnQgPSBUUlVFKQoKcDEgPC0gZ2dwbG90KGRhdGEgPSBmcmVxX0EsCiAgYWVzKGF4aXMxID0gU2V4LCBheGlzMiA9IFNwZWNpZXMsIGF4aXMzID0gU3RyYWluLCB5ID0gRnJlcSkpICsKICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gU2V4KSkgKwogIGdlb21fZmxvdygpICsKICBnZW9tX3N0cmF0dW0oYWVzKGZpbGwgPSBTZXgpKSArCiAgZ2VvbV90ZXh0KHN0YXQgPSAic3RyYXR1bSIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoc3RyYXR1bSkpKSArCiAgI3RoZW1lX21pbmltYWwoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHZqdXN0ID0gMyksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDEsIDAsIDEpLCAiY20iKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiU2V4IiwgIlNwZWNpZXMiLCAiU3RyYWluIiksIGV4cGFuZCA9IGMoMC4xNSwgMC4wNSksIHBvc2l0aW9uID0gInRvcCIpICsKICBnZ3RpdGxlKCJBICBzdHVkeSBzdWJqZWN0cyIpCgpwMQpgYGAKKipGaWcuIDJhKiogUmVsYXRpb25zaGlwL25lc3RlZG5lc3MgYmV0d2VlbiBzdHVkeSBzcGVjaWVzLCBzdHJhaW4gb2Ygcm9kZW50LCBhbmQgc2V4CgojIyMgRW52aXJvbm1lbnRhbCBlbnJpY2htZW50IGluZm86IGFnZS1leGVyY2lzZS1zb2NpYWwgRUUKCmBgYHtyLCByZXN1bHRzID0gJ2hpZGUnLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KCmZyZXFfQiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdCRBZ2VfRUVfZXhwb3N1cmUsIGRhdCRFRV9leGVyY2lzZSwgZGF0JEVFX3NvY2lhbCkpICU+JSByZW5hbWUoQWdlX0VFX2V4cG9zdXJlID0gVmFyMSwgRUVfZXhlcmNpc2UgPSBWYXIyLCBFRV9zb2NpYWwgPSBWYXIzKSAjbWFrZSBhIGRhdGEgZnJhbWUgb2YgZnJlcXVlbmNpZXMgZm9yIHRocmVlIHNlbGVjdGVkIHZhcmlhYmxlcwppc19hbGx1dmlhX2Zvcm0oYXMuZGF0YS5mcmFtZShmcmVxX0IpLCBheGVzID0gMTozLCBzaWxlbnQgPSBUUlVFKQoKcDIgPC0gZ2dwbG90KGRhdGEgPSBmcmVxX0IsCiAgYWVzKGF4aXMxID0gQWdlX0VFX2V4cG9zdXJlLCBheGlzMiA9IEVFX2V4ZXJjaXNlLCBheGlzMyA9IEVFX3NvY2lhbCwgeSA9IEZyZXEpKSArCiAgZ2VvbV9hbGx1dml1bShhZXMoZmlsbCA9IEFnZV9FRV9leHBvc3VyZSkpICsKICBnZW9tX2Zsb3coKSArCiAgZ2VvbV9zdHJhdHVtKGFlcyhmaWxsID0gQWdlX0VFX2V4cG9zdXJlKSkgKwogIGdlb21fdGV4dChzdGF0ID0gInN0cmF0dW0iLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KHN0cmF0dW0pKSkgKwogICN0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCB2anVzdCA9IDMpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dCgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwKICAgICAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLCAxLCAwLCAxKSwgImNtIikpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkFnZSIsICJFeGVyY2lzZSIsICJTb2NpYWwiKSwgZXhwYW5kID0gYygwLjEsIDAuMSksIHBvc2l0aW9uID0gInRvcCIpICsKICBnZ3RpdGxlKCJCICBlbnZpcm9ubWVudGFsIGVucmljaG1lbnQiKQoKcDIKYGBgCioqRmlnLiAyYioqIFJlbGF0aW9uc2hpcC9uZXN0ZWRuZXNzIGJldHdlZW4gdGhlIGFnZSBvZiBlbnJpY2htZW50IGV4cG9zdXJlLCBpZiBlbnJpY2htZW50IGludm9sdmVkIGEgbWFuaXB1bGF0aW9uIG9mIGV4ZXJjaXNlIGFuZCBzb2NpYWwgZW52aXJvbm1lbnQKCiMjIyBTdHJlc3MgaW5mbzogYWdlLWR1cmF0aW9uLXR5cGUgc3RyZXNzCgpgYGB7ciwgcmVzdWx0cyA9ICdoaWRlJywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmZyZXFfQyA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdCRBZ2Vfc3RyZXNzX2V4cG9zdXJlLCBkYXQkU3RyZXNzX2R1cmF0aW9uLCBkYXQkVHlwZV9zdHJlc3NfZXhwb3N1cmUpKSAlPiUgcmVuYW1lKEFnZV9zdHJlc3MgPSBWYXIxLCBEdXJhdGlvbl9zdHJlc3MgPSBWYXIyLCBUeXBlX3N0cmVzcyA9IFZhcjMpICNtYWtlIGEgZGF0YSBmcmFtZSBvZiBmcmVxdWVuY2llcyBmb3IgdGhyZWUgc2VsZWN0ZWQgdmFyaWFibGVzCmlzX2FsbHV2aWFfZm9ybShhcy5kYXRhLmZyYW1lKGZyZXFfQyksIGF4ZXMgPSAxOjMsIHNpbGVudCA9IFRSVUUpCgpwMyA8LSBnZ3Bsb3QoZGF0YSA9IGZyZXFfQywKICBhZXMoYXhpczEgPSBBZ2Vfc3RyZXNzLCBheGlzMiA9IER1cmF0aW9uX3N0cmVzcywgYXhpczMgPSBUeXBlX3N0cmVzcywgeSA9IEZyZXEpKSArCiAgZ2VvbV9hbGx1dml1bShhZXMoZmlsbCA9IEFnZV9zdHJlc3MpKSArCiAgZ2VvbV9mbG93KCkgKwogIGdlb21fc3RyYXR1bShhZXMoZmlsbCA9IEFnZV9zdHJlc3MpKSArCiAgZ2VvbV90ZXh0KHN0YXQgPSAic3RyYXR1bSIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoc3RyYXR1bSkpKSArCiAgI3RoZW1lX21pbmltYWwoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHZqdXN0ID0gMyksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDEsIDAsIDEpLCAiY20iKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiQWdlIiwgIkR1cmF0aW9uIiwgIlR5cGUiKSwgZXhwYW5kID0gYygwLjEsIDAuMSksIHBvc2l0aW9uID0gInRvcCIpICsKICBnZ3RpdGxlKCJDICBzdHJlc3MgZXhwb3N1cmUiKQoKcDMKYGBgCioqRmlnLiAyYyoqIFJlbGF0aW9uc2hpcC9uZXN0ZWRlc3MgYmV0d2VlbiB0aGUgYWdlIG9mIHN0cmVzcyBleHBvc3VyZSwgdGhlIGR1cmF0aW9uIG9mIHRoZSBzdHJlcywgYW5kIHRoZSB0eXBlIG9mIHN0cmVzcwoKIyMjIEFzc2F5IGluZm86IEx2c00tdHlwZS1yZWluZm9yY2VtZW50CgpgYGB7ciwgcmVzdWx0cyA9ICdoaWRlJywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmZyZXFfRCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdCRMZWFybmluZ192c19tZW1vcnksIGRhdCRUeXBlX2Fzc2F5LCBkYXQkVHlwZV9yZWluZm9yY2VtZW50KSkgJT4lIHJlbmFtZShMZWFybmluZ19NZW1vcnkgPSBWYXIxLCBUeXBlID0gVmFyMiwgUmVpbmZvcmNlbWVudCA9IFZhcjMpICNtYWtlIGEgZGF0YSBmcmFtZSBvZiBmcmVxdWVuY2llcyBmb3IgdGhyZWUgc2VsZWN0ZWQgdmFyaWFibGVzCmlzX2FsbHV2aWFfZm9ybShhcy5kYXRhLmZyYW1lKGZyZXFfRCksIGF4ZXMgPSAxOjMsIHNpbGVudCA9IFRSVUUpCgpwNCA8LSBnZ3Bsb3QoZGF0YSA9IGZyZXFfRCwKICBhZXMoYXhpczEgPSBMZWFybmluZ19NZW1vcnksIGF4aXMyID0gVHlwZSwgYXhpczMgPSBSZWluZm9yY2VtZW50LCB5ID0gRnJlcSkpICsKICBnZW9tX2FsbHV2aXVtKGFlcyhmaWxsID0gTGVhcm5pbmdfTWVtb3J5KSkgKwogIGdlb21fZmxvdygpICsKICBnZW9tX3N0cmF0dW0oYWVzKGZpbGwgPSBMZWFybmluZ19NZW1vcnkpKSArCiAgZ2VvbV90ZXh0KHN0YXQgPSAic3RyYXR1bSIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoc3RyYXR1bSkpKSArCiAgI3RoZW1lX21pbmltYWwoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHZqdXN0ID0gMyksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIpLAogICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDEsIDAsIDEpLCAiY20iKSkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiTGVhcm5pbmdfTWVtb3J5IiwgIlR5cGUiLCAiUmVpbmZvcmNlbWVudCIpLCBleHBhbmQgPSBjKDAuMSwgMC4xKSwgcG9zaXRpb24gPSAidG9wIikgKwogIGdndGl0bGUoIkQgIGNvZ25pdGl2ZSBhc3NheSIpCgpwNApgYGAKKipGaWcuIDJkKiogUmVsYXRpb25zaGlwL25lc3RlZG5lc3MgYmV0d2VlbiBpZiB0aGUgYXNzYXkgbWVhc3VyZWQgYSBsZWFybmluZyBvciBtZW1vcnkgdHJhaXQsIHRoZSB0eXBlIG9mIGFzc2F5IHVzZWQsIGFuZCB0aGUgdHlwZSBvZiByZWluZm9yY2VtZW50IHVzZWQKCiMjIyBDb21iaW5lZCBwbG90CgpgYGB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CiNwMSArIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpICNQYXN0ZWwxCgoocDEgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSkgLyAocDIgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSkgLyAocDMgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSkgLyAocDQgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSkgKyBwbG90X2xheW91dChuY29sID0gMSwgaGVpZ2h0cyA9IGMoMSwxLDEsMSwxKSkKCiNnZ3NhdmUoZmlsZSA9ICIuL2ZpZ3MvQWxsdXZpYWxfZGlhZ3JhbXNfdjIucGRmIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTIsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwLCBzY2FsZSA9IDIpICMsIGRldmljZSA9IGNhaXJvX3BkZikKYGBgCioqRmlnLiAyKiogVGhlIGNvbWJpbmVkIHBsb3Qgb2YgYWxsIGFsbHV2aWFsIGRpYWdyYW1zIHVzZWQgdG8gbWFrZSBGaWcuIDIgaW4gdGhlIG1haW4gdGV4dAoKIyMgUmlzayBvZiBCaWFzClBlcmNlbnQgb2Ygc3R1ZGllcyB0aGF0IHVzZWQgcmFuZG9taXNhdGlvbjoKYGBgIHtyfQpkYXQgJT4lIGdyb3VwX2J5KFJPQl9yYW5kb21pc2F0aW9uKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuX2Rpc3RpbmN0KFN0dWR5X0lEKSkKCjE1LzMwCmBgYAoKUGVyY2VudCBvZiBzdHVkaWVzIHRoYXQgdXNlZCBibGluZGluZzoKYGBgIHtyfQojYmxpbmRpbmcKZGF0ICU+JSBncm91cF9ieShST0JfYmxpbmRpbmcpICU+JSAKICBzdW1tYXJpc2UobiA9IG5fZGlzdGluY3QoU3R1ZHlfSUQpKQoKNi8zMApgYGAKCiMgTW9kZWxsaW5nIHdpdGggbG5SUgoKIyMgTWFpbiBlZmZlY3Q6IGVudmlyb25tZW50YWwgZW5yaWNobWVudAoKIyMjIE1ldGEtYW5hbHlzaXMKClRvIHF1YW50aWZ5IGRpZmZlcmVuY2VzIGluIGluZGl2aWR1YWwgcGVyZm9ybWFuY2UgaW4gY29nbml0aXZlIGFzc2F5cyB3aXRoIGVudmlyb25tZW50YWwgZW5yaWNobWVudCwgd2UgdXNlZCB0aGUgbG9nYXJpdGhtIG9mIHJlc3BvbnNlIHJhdGlvIChsblJSKSBjYWxjdWxhdGVkIGFzOiAKCiQkClxsbntcdGV4dHtSUn1fXHRleHR7RUV9fSA9IApcbG5cbGVmdCggXGZyYWN7IE1fXHRleHR7RVN9ICsgIE1fXHRleHR7RUN9fSB7Mn0gXHJpZ2h0KSAtIApcbG5cbGVmdCggXGZyYWMge01fXHRleHR7Q1N9ICsgIE1fXHRleHR7Q0N9fSB7Mn0gXHJpZ2h0KSA9IFxsbiBcbGVmdCgKe1xmcmFjIHtNX1x0ZXh0e0VTfSArIE1fXHRleHR7RUN9fSB7TV9cdGV4dHtDU30gKyBNX1x0ZXh0e0NDfX19IAogXHJpZ2h0KSwKJCQKClZhcmlhbmNlIHdhcyBjYWxjdWxhdGVkIGFzOgoKJCQKXHRleHR7dmFyfShcbG57XHRleHR7UlJ9X1x0ZXh0e0VFfX0pID0gClxsZWZ0KCAKXGZyYWN7MX0geyBNX1x0ZXh0e0VTfSArIE1fXHRleHR7RUN9IH0gClxyaWdodCleMgpcbGVmdCgKXGZyYWN7U0RfXHRleHR7RVN9XjJ9e05fXHRleHR7RVN9fSArIFxmcmFje1NEX1x0ZXh0e0VDfV4yfXtOX1x0ZXh0e0VDfX0KXHJpZ2h0KSArIFxsZWZ0KCBcZnJhYyB7MX0geyAgTV9cdGV4dHtDU30gKyAgTV9cdGV4dHtDQ30gfSBccmlnaHQpXjIKXGxlZnQoXGZyYWN7U0RfXHRleHR7Q1N9XjJ9e05fXHRleHR7Q1N9fSArIFxmcmFje1NEX1x0ZXh0e0NDfV4yfXtuX1x0ZXh0e0NDfX0KXHJpZ2h0KQokJApWYXJpYW5jZSB3YXMgY29udmVydGVkIGluIHRvIHZhcmlhbmNlLWNvdmFyaWFuY2UgKFZDVikgbWF0cml4IChzZWUgYWJvdmUgaW4gJ0RhdGEgb3JnYW5pc2F0aW9uJykgdG8gY29udHJvbCBmb3Igbm9uLWluZGVwZW5kZW5jZSBpbiBzYW1wbGluZyB2YXJpYW5jZSBmcm9tIHRoZSBzYW1lIHN0dWRpZXMuCgpgYGAge3J9CiNkYXQgPC0gcmVhZF9jc3YoaGVyZSgiRGF0YSIsIkRhdGFfcHJvY2Vzc2VkLmNzdiIpKQoKbW9kX0UwIDwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX0UwKSAKaTJfbWwobW9kX0UwKSAKCm9yY2hhcmRfcGxvdChtb2RfRTAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgICMgT3JjaGFyZCBwbG90IAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkrICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9ICJkYXJrb3JhbmdlIikrICMgY2hhbmdlIGNvbG91cnMKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9ImRhcmtvcmFuZ2UiKSsgCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSAKCmBgYAoqKkZpZy4gMyoqIE9yY2hhcmQgcGxvdCBzaG93aW5nIG1ldGEtYW5hbHl0aWMgbWVhbiBhbmQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuICAgCgojIyMgTWV0YS1yZWdyZXNzaW9uOiB1bmktbW9kZXJhdG9yIHsudGFic2V0fQpUbyBleHBsYWluIHNvbWUgb2YgdGhlIHVuZXhwbGFpbmVkIHZhcmlhdGlvbiBpbiB0aGUgbWFpbiBlZmZlY3Qgb2YgZW52aXJvbm1lbnRhbCBlbnJpY2htZW50IG1vZGVsLCB3ZSBjb25kdWN0ZWQgYSBzZXJpZXMgb2YgdW5pLW1vZGVyYXRvciBhbmFseXNlcy4gV2UgY2FsY3VsYXRlZCBtYXJnaW5hbCBSMiBmb3IgZWFjaCBtb2RlcmF0b3IgYXMgd2VsbCBhcyBjb25kdWN0ZWQgYSBzZXJpZXMgb2YgcGFpci13aXNlIGNvbnRyYXN0cyBiZXR3ZWVuIGluIG1vZGVyYXRvciBjYXRlZ29yeS4gCgpBbnkgbW9kZXJhdG9yIGNhdGVnb3JpZXMgd2l0aCBrIDwgNSB3ZXJlIHJlbW92ZWQuCgojIyMjIExlYXJuaW5nIHZzIE1lbW9yeQpXYXMgdGhlIHJlc3BvbnNlIGxlYXJuaW5nIG9yIG1lbW9yeT8KCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9Cm1vZF9FMSA8LSAgcm1hLm12KHlpID0gbG5SUl9FYSwgViA9IFZDVl9FLCBtb2QgPSB+TGVhcm5pbmdfdnNfbWVtb3J5LTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FMSkgCnIyX21sKG1vZF9FMSkgCgpMdnNNX0U8LSBvcmNoYXJkX3Bsb3QobW9kX0UxLCBtb2QgPSAiTGVhcm5pbmdfdnNfbWVtb3J5IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICB4bGltKC0wLjUsIDIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSArICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpICsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKTHZzTV9FCmBgYAoqKkZpZy4gNGEqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ0xlYXJuaW5nX3ZzX21lbW9yeScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4gICAKCiMjIyMjIENvbnRyYXN0cwpgYGAge3J9CmNvbnRyYV9tb2RfRTEgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQsIHJlc3BvbnNlID0gbG5SUl9FYSwgbW9kZXJhdG9yID0gTGVhcm5pbmdfdnNfbWVtb3J5LCBWQ1YgPSBWQ1ZfRSkKcmVzX3RhYmxlX21vZF9FMSA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfRTEsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRTEsIG1vZGVyYXRvciA9IExlYXJuaW5nX3ZzX21lbW9yeSkKCnJlc190YWJsZV9tb2RfRTEKYGBgCgojIyMjIFR5cGUgb2YgYXNzYXkKVGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0eXBlIG9mIGFzc2F5IHVzZWQgdG8gbWVhc3VyZSBsZWFybmluZyBvciBtZW1vcnkgCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpkYXQxIDwtIGZpbHRlcihkYXQsIFR5cGVfYXNzYXkgJWluJSBjKCJSZWNvZ25pdGlvbiIsICJIYWJpdHVhdGlvbiIsICJDb25kaXRpb25pbmciKSkKVkNWX0UxIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDEkbG5SUlZfRSwgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FMiA8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0UxLCBtb2QgPSB+VHlwZV9hc3NheS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDEpCgpzdW1tYXJ5KG1vZF9FMikKcjJfbWwobW9kX0UyKSAKCkxlYXJuaW5nX0UgPC0gb3JjaGFyZF9wbG90KG1vZF9FMiwgbW9kID0gIlR5cGVfYXNzYXkiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHhsaW0oLTAuNSwgMikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIsICJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICAgIGdlb21fc2lnbmlmKGNvbXBhcmlzb25zID0gbGlzdChjKCJDb25kaXRpb25pbmciLCAiUmVjb2duaXRpb24iKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSAiKiIpICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkxlYXJuaW5nX0UKYGBgCioqRmlnLiA0YioqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnVHlwZV9hc3NheScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4gICAKCiMjIyMjIFBhaXJ3aXNlIGNvbXBhcmlzb25zCgpgYGAge3J9CmNvbnRyYV9tb2RfRTIgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQxLCByZXNwb25zZSA9IGxuUlJfRWEsIG1vZGVyYXRvciA9IFR5cGVfYXNzYXksIFZDViA9IFZDVl9FMSkKcmVzX3RhYmxlX21vZF9FMiA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfRTIsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRTIsIG1vZGVyYXRvciA9IFR5cGVfYXNzYXkpCgpyZXNfdGFibGVfbW9kX0UyCmBgYAogCiMjIyMgVHlwZSBvZiByZWluZm9yY2VtZW50IApJZiBjb25kaXRpb25pbmcgd2FzIHVzZWQsIHdhcyBhdmVyc2l2ZSBvciBhcHBldGl0aXZlIHJlaW5mb3JjZW1lbnQgdXNlZD8KCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CgpkYXQyIDwtIGZpbHRlcihkYXQsIFR5cGVfcmVpbmZvcmNlbWVudCAlaW4lIGMoIkFwcGV0aXRpdmUiLCAiQXZlcnNpdmUiLCAiTm90IGFwcGxpY2FibGUiKSkKVkNWX0UyIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDIkbG5SUlZfRSwgY2x1c3RlciA9IGRhdDIkU3R1ZHlfSUQsIHIgPSAwLjUpCm1vZF9FMyA8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0UyLCBtb2QgPSB+IFR5cGVfcmVpbmZvcmNlbWVudC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0MikKCnN1bW1hcnkobW9kX0UzKQpyMl9tbChtb2RfRTMpIAoKUmVpbmZvcmNlbWVudF9FIDwtb3JjaGFyZF9wbG90KG1vZF9FMywgbW9kID0gIlR5cGVfcmVpbmZvcmNlbWVudCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IiwgImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogICAgZ2VvbV9zaWduaWYoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkF2ZXJzaXZlIiwgIk5vdCBhcHBsaWNhYmxlIikpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gIioiKSArCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpSZWluZm9yY2VtZW50X0UKYGBgYAoqKkZpZy4gNGMqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ1R5cGVfcmVpbmZvcmNlbWVudCcgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMjIFBhaXJ3aXNlIGNvbXBhcmlzb25zCgpgYGAge3J9CmNvbnRyYV9tb2RfRTMgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQyLCByZXNwb25zZSA9IGxuUlJfRWEsIG1vZGVyYXRvciA9IFR5cGVfcmVpbmZvcmNlbWVudCwgVkNWID0gVkNWX0UyKQpyZXNfdGFibGVfbW9kX0UzIDwtIGdldF9lc3RpbWF0ZShtb2RlbCA9IG1vZF9FMywgY29udHJhID0gY29udHJhX21vZF9FMywgbW9kZXJhdG9yID0gVHlwZV9yZWluZm9yY2VtZW50KQoKcmVzX3RhYmxlX21vZF9FMwpgYGAKCiMjIyMgQWdlIG9mIGVucmljaG1lbnQKVGhlIGFnZSB3aGVuIGluZGl2aWR1YWxzIHdlcmUgZXhwb3NlZCB0byBlbnZpcm9ubWVudGFsIGVucmljaG1lbnQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDMgPC0gZmlsdGVyKGRhdCwgQWdlX0VFX2V4cG9zdXJlICVpbiUgYygiQWR1bHQiLCAiQWRvbGVzY2VudCIpKQpWQ1ZfRTMgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MyRsblJSVl9FLCBjbHVzdGVyID0gZGF0MyRTdHVkeV9JRCwgciA9IDAuNSkKCgptb2RfRTQgPC0gcm1hLm12KHlpID0gbG5SUl9FYSwgViA9IFZDVl9FMywgbW9kID0gfkFnZV9FRV9leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQzKQoKc3VtbWFyeShtb2RfRTQpIApyMl9tbChtb2RfRTQpIAoKQWdlX0U8LSBvcmNoYXJkX3Bsb3QobW9kX0U0LCBtb2QgPSAiQWdlX0VFX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICB4bGltKC0wLjUsIDIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAgCgpBZ2VfRQpgYGAKKipGaWcuIDRkKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdBZ2VfRUVfZXhwb3N1cmUnIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMjIyBQYWlyd2lzZSBjb21wYXJpc29ucwoKYGBgIHtyfQpjb250cmFfbW9kX0U0IDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0MywgcmVzcG9uc2UgPSBsblJSX0VhLCBtb2RlcmF0b3IgPSBBZ2VfRUVfZXhwb3N1cmUsIFZDViA9IFZDVl9FMykKcmVzX3RhYmxlX21vZF9FNCA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfRTQsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRTQsIG1vZGVyYXRvciA9IEFnZV9FRV9leHBvc3VyZSkKCnJlc190YWJsZV9tb2RfRTQKYGBgCgoKIyMjIyBFeGVyY2lzZSBlbnJpY2htZW50CkRpZCBlbnJpY2htZW50IGludm9sdmUgdGhlIGFkZGl0aW9uIG9mIGFwcGFyYXR1cyBmb3Igdm9sdW50YXJ5IGV4ZXJjaXNlIChlLmcuLCBhIHdoZWVsIG9yIHRyZWFkbWlsbCk/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRTU8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0UsIG1vZCA9IH5FRV9leGVyY2lzZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FNSkKcjJfbWwobW9kX0U1KSAKIApFeGVyY2lzZV9FIDwtb3JjaGFyZF9wbG90KG1vZF9FNSwgbW9kID0gIkVFX2V4ZXJjaXNlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICB4bGltKC0wLjUsIDIpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkV4ZXJjaXNlX0UKYGBgCioqRmlnLiA0ZCoqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnRUVfZXhlcmNpc2UnIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMjIyBQYWlyd2lzZSBjb21wYXJpc29ucwoKYGBgIHtyfQpjb250cmFfbW9kX0U1IDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0LCByZXNwb25zZSA9IGxuUlJfRWEsIG1vZGVyYXRvciA9IEVFX2V4ZXJjaXNlLCBWQ1YgPSBWQ1ZfRSkKcmVzX3RhYmxlX21vZF9FNSA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfRTUsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRTUsIG1vZGVyYXRvciA9IEVFX2V4ZXJjaXNlKQoKcmVzX3RhYmxlX21vZF9FNQpgYGAKCiMjIyMgU29jaWFsIGVucmljaG1lbnQKRGlkIGVucmljaG1lbnQgaW52b2x2ZSBtb3JlIGNvbnNwZWNpZmljcyAobm90ZSB0aGF0IHdlIGRpZCBub3QgaW5jbHVkZSBzdHVkaWVzIHRoYXQgb25seSBwcm92aWRlZCBzb2NpYWwgZW5yaWNobWVudCBidXQgbm8gb3RoZXIgZm9ybSBvZiBhYmlvdGljIGVucmljaG1lbnQpPwoKYGBgIHtyLCAgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDQgPC0gZmlsdGVyKGRhdCwgRUVfc29jaWFsICVpbiUgYygiU29jaWFsIiwgIk5vbi1zb2NpYWwiKSkKVkNWX0U0IDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDQkbG5SUlZfRSwgY2x1c3RlciA9IGRhdDQkU3R1ZHlfSUQsIHIgPSAwLjUpCiAgCm1vZF9FNjwtIHJtYS5tdih5aSA9IGxuUlJfRWEsIFYgPSBWQ1ZfRTQsIG1vZCA9IH5FRV9zb2NpYWwtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsZGF0YSA9IGRhdDQpCgpzdW1tYXJ5KG1vZF9FNikKcjJfbWwobW9kX0U2KSAKClNvY2lhbF9FIDwtb3JjaGFyZF9wbG90KG1vZF9FNiwgbW9kID0gIkVFX3NvY2lhbCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgeGxpbSgtMC41LCAyKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKClNvY2lhbF9FIApgYGAKKipGaWcuIDRlKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdFRV9zb2NpYWwnIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMjIyBQYWlyd2lzZSBjb21wYXJpc29ucwoKYGBgIHtyfQpjb250cmFfbW9kX0U2IDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0NCwgcmVzcG9uc2UgPSBsblJSX0VhLCBtb2RlcmF0b3IgPSBFRV9zb2NpYWwsIFZDViA9IFZDVl9FNCkKcmVzX3RhYmxlX21vZF9FNiA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfRTUsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRTYsIG1vZGVyYXRvciA9IEVFX3NvY2lhbCkKCnJlc190YWJsZV9tb2RfRTYKYGBgCgoKIyMjIFB1YmxpY2F0aW9uIGJpYXMgJiBzZW5zaXRpdml0eSBhbmFseXNpcyB7LnRhYnNldH0KCiMjIyMgIE11bHRpLW1vZGVyYXRvciBtb2RlbApXZSByYW4gYSBtdWx0aS1tb2RlcmF0b3Ig4oCYZnVsbOKAmSBtb2RlbCBvZiBhbGwgbW9kZXJhdG9ycy4gV2UgcmFuIG1vZGVsIHNlbGVjdGlvbiBiYXNlZCBvbiBBSUMgYW5kIHNlbGVjdGVkIHRoZSB0b3Agc2V0IG9mIG1vZGVscyB3aXRoaW4gZGVsdGEgQUlDIG9mIDYgYW5kIGNhbGN1bGF0ZWQgdGhlIGltcG9ydGFuY2Ugb2YgZWFjaCBtb2RlcmF0b3IgKGkuZS4sIEFrYWlrZSB3ZWlnaHRzKSB3aXRoaW4gdGhpcyB0b3AgbW9kZWwgc2V0LgoKYGBgIHtyLCBldmFsID0gRkFMU0V9CiMgZmlsdGVyIGRhdGEgc28gdGhhdCBhbGwgSyA8IDUgYXJlIHJlbW92ZWQKZGF0X0VmbSA8LSBkYXQgJT4lCiAgZmlsdGVyKFR5cGVfYXNzYXkgJWluJSBjKCJSZWNvZ25pdGlvbiIsICJIYWJpdHVhdGlvbiIsICJDb25kaXRpb25pbmciKSwKICAgICAgICAgVHlwZV9yZWluZm9yY2VtZW50ICVpbiUgYygiQXBwZXRpdGl2ZSIsICJBdmVyc2l2ZSIsICJOb3QgYXBwbGljYWJsZSIpLAogICAgICAgICBFRV9zb2NpYWwgJWluJSBjKCJTb2NpYWwiLCAiTm9uLXNvY2lhbCIpLCAKICAgICAgICAgQWdlX0VFX2V4cG9zdXJlICVpbiUgYygiQWR1bHQiLCAiQWRvbGVzY2VudCIpKQoKI1ZDVl9FZm0gPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0X0VmbSRsblJSVl9FLCBjbHVzdGVyID0gZGF0X0VmbSRTdHVkeV9JRCwgciA9IDAuNSkKICAgICAgICAgICAgICAgICAKbW9kX0VmbSA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX0VmbSwgbW9kID0gflR5cGVfYXNzYXktMSArIExlYXJuaW5nX3ZzX21lbW9yeSArIFR5cGVfcmVpbmZvcmNlbWVudCArIEVFX3NvY2lhbCArIEVFX2V4ZXJjaXNlICsgQWdlX0VFX2V4cG9zdXJlICwgcmFuZG9tID0gICBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRfRWZtKQojc3VtbWFyeShtb2RfRWZtKQojcjJfbWwobW9kX0VmbSkgCgpyZXNfRWZtIDwtIGRyZWRnZShtb2RfRWZtLCB0cmFjZT0yKQpzYXZlUkRTKHJlc19FZm0sIGZpbGUgPSBoZXJlKCJSZGF0YSIsICJyZXNfRWZtLnJkcyIpKQojIGFsc28gc2F2aW5nIHRoZSBmdWxsIG1vZGVsIGFuZCBkYXRhCnNhdmVSRFMobW9kX0VmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgIm1vZF9FZm0ucmRzIikpCnNhdmVSRFMoZGF0X0VmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgImRhdF9FZm0ucmRzIikpCmBgYAoKVGhlIGFrYWlrZSB3ZWlnaHRzIGZvciB0aGUgdG9wIHNldCBvZiBtb2RlbHMgd2l0aCBBSUMgPCA2CgpgYGB7cn0KZGF0X0VmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJkYXRfRWZtLnJkcyIpKQptb2RfRWZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgIm1vZF9FZm0ucmRzIikpCnJlc19FZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAicmVzX0VmbS5yZHMiKSkKcmVzX0VmbTI8LSBzdWJzZXQocmVzX0VmbSwgZGVsdGEgPD0gNiwgcmVjYWxjLndlaWdodHM9RkFMU0UpCmltcG9ydGFuY2UocmVzX0VmbTIpCmBgYAoKIyMjIyBGdW5uZWwgcGxvdApXZSBwcm9kdWNlZCBmdW5uZWwgcGxvdHMgb2YgZWZmZWN0IHNpemVzIGFnYWluc3QgdGhlIHJlc2lkdWFscyBvZiB0aGUgZnVsbCBtb2RlbCB0byB2aXN1YWxseSBpbnNwZWN0IGZvciBmdW5uZWwgYXN5bW1ldHJ5CgpVc2VkIHRvIHByb2R1Y2UgRmlnLiA3YQpgYGAge3J9CgojIGZ1bm5lbCBwbG90CkZ1bm5lbF9FPC1mdW5uZWwobW9kX0VmbSwgeGxhYiA9ICJsblJSIiwgeWxhYiA9ICJTdGFuZGFyZCBFcnJvciIpCiNGdW5uZWxfRQoKYGBgCioqRmlnLjdhKiogRnVubmVsIHBsb3Qgc2hvd2luZyB0aGUgc3RhbmRhcmQgZXJyb3IgYW5kIHJlc2lkdWFscyAobG5SUikgZnJvbSB0aGUgZnVsbCBtb2RlbC4KCiMjIyMgRWdnZXIncyByZWdyZXNzaW9uIGFuZCB0aW1lLWxhZyBiaWFzCldlIGZpdHRlZCBlZmZlY3RpdmUgc2FtcGxlIHNpemUgY2FsY3VsYXRlZCBhczoKCiQkClxzcXJ0e1xmcmFjIHsxfSB7IFx0aWxkZXtOfSB9fSAgPQpcc3FydHtcZnJhYyB7MX0geyBOX1x0ZXh0e0VTfX0gKyBcZnJhY3sxfXtOX1x0ZXh0e0VDfX0gKyAKXGZyYWMgezF9e05fXHRleHR7Q1N9fSArIFxmcmFjezF9e05fXHRleHR7Q0N9fX0sCiQkCgphbmQgeWVhciBvZiBwdWJsaWNhdGlvbiBhcyBtb2RlcmF0b3JzIGluIHRoZSBmdWxsIG1vZGVsIHRvIGluZmVyZW50aWFsbHkgdGVzdCBmb3IgZnVubmVsIGFzeW1tZXRyeSBhbmQgYSBkZWNyZWFzZSBpbiBlZmZlY3Qgc2l6ZXMgd2l0aCBwdWJsaWNhdGlvbiB5ZWFyCgpgYGAge3J9ClZDVl9FZm0gPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0X0VmbSRsblJSVl9FLCBjbHVzdGVyID0gZGF0X0VmbSRTdHVkeV9JRCwgciA9IDAuNSkKZGF0X0VmbSRjX1llYXJfcHVibGlzaGVkIDwtIGFzLnZlY3RvcihzY2FsZShkYXRfRWZtJFllYXJfcHVibGlzaGVkLCBzY2FsZSA9IEYpKQoKZGF0X0VmbSRzcXJ0X2ludl9lX24gPC0gd2l0aChkYXRfRWZtLCBzcXJ0KDEvQ0NfbiArIDEvRUNfbiArIDEvRVNfbiArIDEvQ1NfbikpCgpQQl9NUl9FPC0gcm1hLm12KGxuUlJfU2EsIFZDVl9FZm0sIG1vZHMgPSB+MSArIHNxcnRfaW52X2VfbiArICBMZWFybmluZ192c19tZW1vcnkgKyBZZWFyX3B1Ymxpc2hlZCArIFR5cGVfYXNzYXkgKyBUeXBlX3JlaW5mb3JjZW1lbnQgKyBFRV9zb2NpYWwgKyBFRV9leGVyY2lzZSArIEFnZV9zdHJlc3NfZXhwb3N1cmUsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksIG1ldGhvZCA9ICJSRU1MIiwgdGVzdCA9ICJ0IiwgCiAgICBkYXRhID0gZGF0X0VmbSkKCiNQQl9NUl9FCgplc3RpbWF0ZXNfUEJfTVJfRTwtIGVzdGltYXRlcy5DSShQQl9NUl9FKQplc3RpbWF0ZXNfUEJfTVJfRQpgYGAKCiMjIyMgTGVhdmUtb25lLW91dCBhbmFseXNpcwpXZSBpbmRpdmlkdWFsbHkgcmVtb3ZlZCBzdHVkaWVzIHRvIGRldGVybWluZSBpZiBhbnkgc2luZ3VsYXIgc3R1ZGllcyBodmUgYSBkaXNwcm9wb3J0aW9uYXRlIGVmZmVjdCBvbiB0aGUgbWV0YS1hbmFseXRpYyBtZWFuIGFuZCBDSS4KCmBgYCB7ciwgZXZhbCA9IEZBTFNFfQpkYXQkU3R1ZHlfSUQgPC0gYXMuZmFjdG9yKGRhdCRTdHVkeV9JRCkKCkxlYXZlT25lT3V0X2VmZmVjdHNpemUgPC0gbGlzdCgpCmZvcihpIGluIDE6bGVuZ3RoKGxldmVscyhkYXQkU3R1ZHlfSUQpKSl7CiAgCiAgZCA8LSBkYXQgJT4lIGZpbHRlcihTdHVkeV9JRCAhPSBsZXZlbHMoZGF0JFN0dWR5X0lEKVtpXSkKICAKICBWQ1ZfRWIgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZCRsblJSVl9FLCBjbHVzdGVyID0gZCRTdHVkeV9JRCwgciA9IDAuNSkKICAKICBMZWF2ZU9uZU91dF9lZmZlY3RzaXplW1tpXV0gPC0gcm1hLm12KHlpID0gbG5SUl9FYSwgViA9IFZDVl9FYiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSBsaXN0KH4xIHwgU3R1ZHlfSUQsfjF8IEVTX0lELCB+MSB8IFN0cmFpbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIlJFTUwiLCBkYXRhID0gZGF0W2RhdCRTdHVkeV9JRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldLCBdKX0KCiMgd3JpdGluZyBmdW5jdGlvbiBmb3IgZXh0cmFjdGluZyBlc3QsIGNpLmxiLCBhbmQgY2kudWIgZnJvbSBhbGwgbW9kZWxzCmVzdC5mdW5jIDwtIGZ1bmN0aW9uKG1vZF9FMCl7CiAgZGYgPC0gZGF0YS5mcmFtZShlc3QgPSBtb2RfRTAkYiwgbG93ZXIgPSBtb2RfRTAkY2kubGIsIHVwcGVyID0gbW9kX0UwJGNpLnViKQogIHJldHVybihkZikKfQoKCiN1c2luZyBkcGx5ciB0byBmb3JtIGRhdGEgZnJhbWUKTUFfQ1ZSX0UgPC0gbGFwcGx5KExlYXZlT25lT3V0X2VmZmVjdHNpemUsIGZ1bmN0aW9uKHgpIGVzdC5mdW5jKHgpKSU+JSBiaW5kX3Jvd3MgJT4lIG11dGF0ZShsZWZ0X291dCA9IGxldmVscyhkYXQkU3R1ZHlfSUQpKQoKCnNhdmVSRFMoTUFfQ1ZSX0UsZmlsZSA9IGhlcmUoIlJkYXRhIiwgIk1BX0NWUl9FLnJkcyIpKQpgYGAKClVzZWQgdG8gcHJvZHVjZSBGaWcuIFMzCmBgYCB7cn0KI3RlbGxpbmcgZ2dwbG90IHRvIHN0b3AgcmVvcmRlcmluZyBmYWN0b3JzCk1BX0NWUl9FIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgIk1BX0NWUl9FLnJkcyIpKQoKTUFfQ1ZSX0UkbGVmdF9vdXQ8LSBhcy5mYWN0b3IoTUFfQ1ZSX0UkbGVmdF9vdXQpCk1BX0NWUl9FJGxlZnRfb3V0PC1mYWN0b3IoTUFfQ1ZSX0UkbGVmdF9vdXQsIGxldmVscyA9IE1BX0NWUl9FJGxlZnRfb3V0KQoKCiNwbG90dGluZwpsZWF2ZW9uZW91dF9FIDwtIGdncGxvdChNQV9DVlJfRSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGx3ZCA9IDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkY2kubGIsIGx0eSA9IDMsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtb2RfRTAkYiwgbHR5ID0gMSwgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9FMCRjaS51YiwgbHR5ID0gMywgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeCA9IGxlZnRfb3V0LCB5ID0gZXN0LCB5bWluID0gbG93ZXIsIHltYXggPSB1cHBlcikpICsKICB4bGFiKCJTdHVkeSBsZWZ0IG91dCIpICsgCiAgeWxhYigibG5SUiwgOTUlIENJIikgKyAKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpKwogIHRoZW1lX2J3KCkgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpICkgKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCmxlYXZlb25lb3V0X0UKCmRhdCRTdHVkeV9JRCA8LSBhcy5pbnRlZ2VyKGRhdCRTdHVkeV9JRCkKYGBgCioqRmlnLiBTMyoqIExlYXZlLW9uZS1ncm91cC1vdXQgYW5hbHlzaXMgc2hvd2luZyBtZXRhLWFuYWx5dGljIG1lYW4gYW5kIDk1JSBDSSB3aGVuIGVhY2ggaW5kaXZpZHVhbCBzdHVkeSBpcyByZW1vdmVkIGZyb20gdGhlIGRhdGEgc2V0LiAKCiMjIyMgVXNpbmcgU01ECldlIHJlLXJhbiB0aGUgbWFpbiBlZmZlY3Qgb2YgZW52aXJvbm1lbnRhbCBlbnJpY2htZW50IG1ldGEtYW5hbHl0aWMgbW9kZWwgdXNpbmcgc3RhbmRhcmRpc2VkIG1lYW4gZGlmZmVyZW5jZSAoU01EKSBpbnN0ZWFkIG9mIGxuUlIKCmBgYCB7cn0KCm1vZF9FMGEgPC0gcm1hLm12KHlpID0gU01EX0VhLCBWID0gVkNWX0VhLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9FMGEpCmkyX21sKG1vZF9FMGEpCgpgYGAKCiMjIyMgUmlzayBvZiBCaWFzCgpJbmNsdWRpbmcgaWYgdGhlIHN0dWR5IHdhcyByYW5kb21pc2VkIGFzIGEgbW9kZXJhdG9yIGFuZCBjb25kdWN0aW5nIGEgcGFpci13aXNlIGNvbnRyYXN0CgpgYGAge3IsIHJlc3VsdHMgPSAnaGlkZSd9Cm1vZF9yYW5kb21pc2VkX0U8LSBybWEubXYoeWkgPSBsblJSX0VhLCBWID0gVkNWX0UsIG1vZCA9IH5ST0JfcmFuZG9taXNhdGlvbi0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IixkYXRhID0gZGF0KQoKc3VtbWFyeShtb2RfcmFuZG9taXNlZF9FKQpyMl9tbChtb2RfcmFuZG9taXNlZF9FKSAKCmBgYAoKYGBgIHtyfQpjb250cmFfbW9kX3JhbmRvbWlzZWRfRSA8LSBjb250cmFzdF9mdW4oZGF0YSA9IGRhdCwgcmVzcG9uc2UgPSBsblJSX0VhLCBtb2RlcmF0b3IgPSBST0JfcmFuZG9taXNhdGlvbiwgVkNWID0gVkNWX0UpCnJlc190YWJsZV9tb2RfcmFuZG9taXNlZF9FIDwtIGdldF9lc3RpbWF0ZShtb2RlbCA9IG1vZF9yYW5kb21pc2VkX0UsIGNvbnRyYSA9IGNvbnRyYV9tb2RfcmFuZG9taXNlZF9FLCBtb2RlcmF0b3IgPSBST0JfcmFuZG9taXNhdGlvbikKCnJlc190YWJsZV9tb2RfcmFuZG9taXNlZF9FCmBgYAoKSW5jbHVkaW5nIGlmIHRoZSBzdHVkeSB1c2VkIGJsaW5kaW5nIGFuZCBjb25kdWN0aW5nIGEgcGFpci13aXNlIGNvbnRyYXN0CgpgYGAge3IsIHJlc3VsdHMgPSAnaGlkZSd9Cm1vZF9ibGluZGluZ19FPC0gcm1hLm12KHlpID0gbG5SUl9FYSwgViA9IFZDVl9FLCBtb2QgPSB+Uk9CX2JsaW5kaW5nLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9ibGluZGluZ19FKQpyMl9tbChtb2RfYmxpbmRpbmdfRSkgCgpgYGAKCmBgYCB7cn0KY29udHJhX21vZF9ibGluZGluZ19FIDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0LCByZXNwb25zZSA9IGxuUlJfRWEsIG1vZGVyYXRvciA9IFJPQl9ibGluZGluZywgVkNWID0gVkNWX0UpCnJlc190YWJsZV9tb2RfYmxpbmRpbmdfRSA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfYmxpbmRpbmdfRSwgY29udHJhID0gY29udHJhX21vZF9ibGluZGluZ19FLCBtb2RlcmF0b3IgPSBST0JfYmxpbmRpbmcpCgpyZXNfdGFibGVfbW9kX2JsaW5kaW5nX0UKYGBgCgojIyBNYWluIGVmZmVjdDogc3RyZXNzCgojIyMgTWV0YS1hbmFseXNpcwpUbyBxdWFudGlmeSBkaWZmZXJlbmNlcyBpbiBpbmRpdmlkdWFsIHBlcmZvcm1hbmNlIGluIGNvZ25pdGl2ZSBhc3NheXMgd2l0aCBzdHJlc3MsIHdlIHVzZWQgdGhlIGxvZ2FyaXRobSBvZiByZXNwb25zZSByYXRpbyAobG5SUikgY2FsY3VsYXRlZCBhczogCgoKJCQKXGxue1x0ZXh0e1JSfV9cdGV4dHtzdHJlc3N9fSA9IApcbG5cbGVmdCggXGZyYWN7IE1fXHRleHR7RVN9ICsgIE1fXHRleHR7Q1N9fSB7Mn0gXHJpZ2h0KSAtIApcbG5cbGVmdCggXGZyYWMge01fXHRleHR7RUN9ICsgIE1fXHRleHR7Q0N9fSB7Mn0gXHJpZ2h0KSA9IFxsbiBcbGVmdCgKe1xmcmFjIHtNX1x0ZXh0e0VTfSArIE1fXHRleHR7Q1N9fSB7TV9cdGV4dHtFQ30gKyBNX1x0ZXh0e0NDfX19IAogXHJpZ2h0KSwKJCQKClZhcmlhbmNlIHdhcyBjYWxjdWxhdGVkIGFzOgoKJCQKXHRleHR7dmFyfShcbG57XHRleHR7UlJ9X1x0ZXh0e3N0cmVzc319KSA9ClxsZWZ0KCAKXGZyYWN7MX0geyBNX1x0ZXh0e0VTfSArIE1fXHRleHR7Q1N9IH0gClxyaWdodCleMgpcbGVmdCgKXGZyYWN7U0RfXHRleHR7RVN9XjJ9e05fXHRleHR7RVN9fSArIFxmcmFje1NEX1x0ZXh0e0NTfV4yfXtOX1x0ZXh0e0NTfX0KXHJpZ2h0KSArIFxsZWZ0KCBcZnJhYyB7MX0geyAgTV9cdGV4dHtFQ30gKyAgTV9cdGV4dHtDQ30gfSBccmlnaHQpXjIKXGxlZnQoXGZyYWN7U0RfXHRleHR7RUN9XjJ9e05fXHRleHR7RUN9fSArIFxmcmFje1NEX1x0ZXh0e0NDfV4yfXtOX1x0ZXh0e0NDfX0KXHJpZ2h0KQokJApWYXJpYW5jZSB3YXMgY29udmVydGVkIGluIHRvIHZhcmlhbmNlLWNvdmFyaWFuY2UgKFZDVikgbWF0cml4IChzZWUgYWJvdmUgaW4gJ0RhdGEgb3JnYW5pc2F0aW9uJykgdG8gY29udHJvbCBmb3Igbm9uLWluZGVwZW5kZW5jZSBpbiBzYW1wbGluZyB2YXJpYW5jZSBmcm9tIHRoZSBzYW1lIHN0dWRpZXMuCgpgYGAge3J9Cm1vZF9TMCA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX1MwKSAKaTJfbWwobW9kX1MwKSAKCm9yY2hhcmRfcGxvdChtb2RfUzAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSAKYGBgCioqRmlnLiAzKiogT3JjaGFyZCBwbG90IHNob3dpbmcgbWV0YS1hbmFseXRpYyBtZWFuIGFuZCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4gIAoKIyMjIE1ldGEtcmVncmVzc2lvbjogdW5pLW1vZGVyYXRvciB7LnRhYnNldH0KVG8gZXhwbGFpbiBzb21lIG9mIHRoZSB1bmV4cGxhaW5lZCB2YXJpYXRpb24gaW4gdGhlIG1haW4gZWZmZWN0IG9mIHN0cmVzcyBtb2RlbCwgd2UgY29uZHVjdGVkIGEgc2VyaWVzIG9mIHVuaS1tb2RlcmF0b3IgYW5hbHlzZXMuIFdlIGNhbGN1bGF0ZWQgbWFyZ2luYWwgUjIgZm9yIGVhY2ggbW9kZXJhdG9yIGFzIHdlbGwgYXMgY29uZHVjdGVkIGEgc2VyaWVzIG9mIHBhaXItd2lzZSBjb250cmFzdHMgYmV0d2VlbiBpbiBtb2RlcmF0b3IgY2F0ZWdvcnkuIAoKQW55IG1vZGVyYXRvciBjYXRlZ29yaWVzIHdpdGggayA8IDUgd2VyZSByZW1vdmVkLgoKIyMjIyBMZWFybmluZyB2cyBNZW1vcnkKV2FzIHRoZSByZXNwb25zZSBsZWFybmluZyBvciBtZW1vcnk/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQoKbW9kX1MxIDwtICBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MsIG1vZCA9IH5MZWFybmluZ192c19tZW1vcnktMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX1MxKSAKcjJfbWwobW9kX1MxKSAKCkx2c01fUyA8LSBvcmNoYXJkX3Bsb3QobW9kX1MxLCBtb2QgPSAiTGVhcm5pbmdfdnNfbWVtb3J5IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpMdnNNX1MgCmBgYAoqKkZpZy4gNWEqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ0xlYXJuaW5nX3ZzX21lbW9yeScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4gICAKCiMjIyMjIENvbnRyYXN0cwpgYGAge3J9CmNvbnRyYV9tb2RfUzEgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQsIHJlc3BvbnNlID0gbG5SUl9TYSwgbW9kZXJhdG9yID0gTGVhcm5pbmdfdnNfbWVtb3J5LCBWQ1YgPSBWQ1ZfUykKcmVzX3RhYmxlX21vZF9TMSA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfUzEsIGNvbnRyYSA9IGNvbnRyYV9tb2RfUzEsIG1vZGVyYXRvciA9IExlYXJuaW5nX3ZzX21lbW9yeSkKCnJlc190YWJsZV9tb2RfUzEKYGBgCgoKIyMjIyBUeXBlIG9mIGFzc2F5ClRoZSBicm9hZCBjYXRlZ29yeSBvZiB0aGUgdHlwZSBvZiBhc3NheSB1c2VkIHRvIG1lYXN1cmUgbGVhcm5pbmcgb3IgbWVtb3J5IAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KZGF0JFR5cGVfYXNzYXk8LWFzLmZhY3RvcihkYXQkVHlwZV9hc3NheSkKClZDVl9TMSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQxJGxuUlJWX1MsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgoKbW9kX1MyIDwtIHJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfUzEsIG1vZCA9IH5UeXBlX2Fzc2F5LTEsIHJhbmRvbSA9ICAgbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0MSkKCnN1bW1hcnkobW9kX1MyKQpyMl9tbChtb2RfUzIpIAoKTGVhcm5pbmdfUyA8LW9yY2hhcmRfcGxvdChtb2RfUzIsIG1vZCA9ICJUeXBlX2Fzc2F5IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogICAgZ2VvbV9zaWduaWYoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkhhYml0dWF0aW9uIiwgIlJlY29nbml0aW9uIikpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gIioqKiIpICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCkxlYXJuaW5nX1MKYGBgCioqRmlnLiA1YioqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnVHlwZV9hc3NheScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMjIENvbnRyYXN0cwpgYGAge3J9CmNvbnRyYV9tb2RfUzIgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQxLCByZXNwb25zZSA9IGxuUlJfU2EsIG1vZGVyYXRvciA9IFR5cGVfYXNzYXksIFZDViA9IFZDVl9TMSkKcmVzX3RhYmxlX21vZF9TMiA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfUzIsIGNvbnRyYSA9IGNvbnRyYV9tb2RfUzIsIG1vZGVyYXRvciA9IFR5cGVfYXNzYXkpCgpyZXNfdGFibGVfbW9kX1MyCmBgYAoKIyMjIyBUeXBlIG9mIHJlaW5mb3JjZW1lbnQKSWYgY29uZGl0aW9uaW5nIHdhcyB1c2VkLCB3YXMgYXZlcnNpdmUgb3IgYXBwZXRpdGl2ZSByZWluZm9yY2VtZW50IHVzZWQ/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQoKVkNWX1MyIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdDIkbG5SUlZfUywgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9TMyA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MyLCBtb2QgPSB+IFR5cGVfcmVpbmZvcmNlbWVudC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0MikKCnN1bW1hcnkobW9kX1MzKQpyMl9tbChtb2RfUzMpIAoKUmVpbmZvcmNlbWVudF9TIDwtb3JjaGFyZF9wbG90KG1vZF9TMywgbW9kID0gIlR5cGVfcmVpbmZvcmNlbWVudCIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSA1LCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKUmVpbmZvcmNlbWVudF9TCmBgYGAKKipGaWcuIDVjKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdUeXBlX3JlaW5mb3JjZW1lbnQnIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMjIyBDb250cmFzdHMKYGBgIHtyfQpjb250cmFfbW9kX1MzIDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0MiwgcmVzcG9uc2UgPSBsblJSX1NhLCBtb2RlcmF0b3IgPSBUeXBlX3JlaW5mb3JjZW1lbnQsIFZDViA9IFZDVl9TMikKcmVzX3RhYmxlX21vZF9TMyA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfUzMsIGNvbnRyYSA9IGNvbnRyYV9tb2RfUzMsIG1vZGVyYXRvciA9IFR5cGVfcmVpbmZvcmNlbWVudCkKCnJlc190YWJsZV9tb2RfUzMKYGBgCgoKIyMjIyBBZ2Ugb2Ygc3RyZXNzClRoZSBhZ2Ugd2hlbiBpbmRpdmlkdWFscyB3ZXJlIGV4cG9zZWQgdG8gc3RyZXNzCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQoKbW9kX1M0IDwtcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TLCBtb2QgPSB+QWdlX3N0cmVzc19leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9TNCkgCnIyX21sKG1vZF9TNCkgCgpBZ2VfUyA8LSBvcmNoYXJkX3Bsb3QobW9kX1M0LCBtb2QgPSAiQWdlX3N0cmVzc19leHBvc3VyZSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiLCAiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICAgIGdlb21fc2lnbmlmKGNvbXBhcmlzb25zID0gbGlzdChjKCJBZHVsdCIsICJFYXJseSBwb3N0bmF0YWwiKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSAiKiIpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpBZ2VfUyAKYGBgCioqRmlnLiA1ZCoqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnQWdlX3N0cmVzc19leHBvc3VyZScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMjIENvbnRyYXN0cwpgYGAge3J9CmNvbnRyYV9tb2RfUzQgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQsIHJlc3BvbnNlID0gbG5SUl9TYSwgbW9kZXJhdG9yID0gQWdlX3N0cmVzc19leHBvc3VyZSwgVkNWID0gVkNWX1MpCnJlc190YWJsZV9tb2RfUzQgPC0gZ2V0X2VzdGltYXRlKG1vZGVsID0gbW9kX1M0LCBjb250cmEgPSBjb250cmFfbW9kX1M0LCBtb2RlcmF0b3IgPSBBZ2Vfc3RyZXNzX2V4cG9zdXJlKQoKcmVzX3RhYmxlX21vZF9TNApgYGAKCiMjIyMgVHlwZSBvZiBzdHJlc3MKVGhlIHR5cGUgb2Ygc3RyZXNzb3IgdXNlZAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KZGF0NSA8LSBmaWx0ZXIoZGF0LCBUeXBlX3N0cmVzc19leHBvc3VyZSAlaW4lIGMoIlJlc3RyYWludCIsICJOb2lzZSIsICJNUyIsICJDb21iaW5hdGlvbiIpKQpWQ1ZfUzMgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0NSRsblJSVl9TLCBjbHVzdGVyID0gZGF0NSRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9TNSA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1MzLCBtb2QgPSB+VHlwZV9zdHJlc3NfZXhwb3N1cmUtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDUpCnN1bW1hcnkobW9kX1M1KSAKcjJfbWwobW9kX1M1KQoKU3RyZXNzb3I8LSBvcmNoYXJkX3Bsb3QobW9kX1M1LCBtb2QgPSAiVHlwZV9zdHJlc3NfZXhwb3N1cmUiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IiwgImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDUsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKU3RyZXNzb3IKYGBgYAoqKkZpZy4gNWUqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ1R5cGVfc3RyZXNzX2V4cG9zdXJlJyB3aXRoIHRoZWlyIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLgoKIyMjIyMgQ29udHJhc3RzCmBgYCB7cn0KY29udHJhX21vZF9TNSA8LSBjb250cmFzdF9mdW4oZGF0YSA9IGRhdDUsIHJlc3BvbnNlID0gbG5SUl9TYSwgbW9kZXJhdG9yID1UeXBlX3N0cmVzc19leHBvc3VyZSwgVkNWID0gVkNWX1MzKQpyZXNfdGFibGVfbW9kX1M1IDwtIGdldF9lc3RpbWF0ZShtb2RlbCA9IG1vZF9TNSwgY29udHJhID0gY29udHJhX21vZF9TNSwgbW9kZXJhdG9yID0gVHlwZV9zdHJlc3NfZXhwb3N1cmUpCgpyZXNfdGFibGVfbW9kX1M1CmBgYAoKIyMjIyBTdGVzcyBkdXJhdGlvbgpXYXMgdGhlIHN0cmVzcyBhY3V0ZSBvciBjaHJvbmljPwoKYGBgIHtyLCAgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CmRhdDYgPC0gZmlsdGVyKGRhdCwgU3RyZXNzX2R1cmF0aW9uICVpbiUgYygiQ2hyb25pYyIsICJBY3V0ZSIpKQpWQ1ZfUzQgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0NiRsblJSVl9TLCBjbHVzdGVyID0gZGF0NiRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9TNiA8LXJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfUzQsIG1vZCA9IH5TdHJlc3NfZHVyYXRpb24tMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQ2KQpzdW1tYXJ5KG1vZF9TNikgCnIyX21sKG1vZF9TNikgCgpEdXJhdGlvbl9TIDwtIG9yY2hhcmRfcGxvdChtb2RfUzYsIG1vZCA9ICJTdHJlc3NfZHVyYXRpb24iLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogICAgZ2VvbV9zaWduaWYoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkNocm9uaWMiLCAiQWN1dGUiKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSAiKiIpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIAoKRHVyYXRpb25fUyAKYGBgCioqRmlnLiA1ZioqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnU3RyZXNzX2R1cmF0aW9uJyB3aXRoIHRoZWlyIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLgoKIyMjIyMgQ29udHJhc3RzCmBgYCB7cn0KY29udHJhX21vZF9TNiA8LSBjb250cmFzdF9mdW4oZGF0YSA9IGRhdDYsIHJlc3BvbnNlID0gbG5SUl9TYSwgbW9kZXJhdG9yID1TdHJlc3NfZHVyYXRpb24sIFZDViA9IFZDVl9TNCkKcmVzX3RhYmxlX21vZF9TNiA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfUzYsIGNvbnRyYSA9IGNvbnRyYV9tb2RfUzYsIG1vZGVyYXRvciA9IFN0cmVzc19kdXJhdGlvbikKCnJlc190YWJsZV9tb2RfUzYKYGBgCgojIyMgUHVibGljYXRpb24gYmlhcyAmIHNlbnNpdGl2aXR5IGFuYWx5c2lzIHsudGFic2V0fQoKIyMjIyAgTXVsdGktbW9kZXJhdG9yIG1vZGVsCldlIHJhbiBhIG11bHRpLW1vZGVyYXRvciDigJhmdWxs4oCZIG1vZGVsIG9mIGFsbCBtb2RlcmF0b3JzLiBXZSByYW4gbW9kZWwgc2VsZWN0aW9uIGJhc2VkIG9uIEFJQyBhbmQgc2VsZWN0ZWQgdGhlIHRvcCBzZXQgb2YgbW9kZWxzIHdpdGhpbiBkZWx0YSBBSUMgb2YgNiBhbmQgY2FsY3VsYXRlZCB0aGUgaW1wb3J0YW5jZSBvZiBlYWNoIG1vZGVyYXRvciAoaS5lLiwgQWthaWtlIHdlaWdodHMpIHdpdGhpbiB0aGlzIHRvcCBtb2RlbCBzZXQuCgpgYGAge3IsIGV2YWwgPSBGQUxTRX0KCiNzZWxlY3RpbmcgbW9kZXJhdG9yIGxldmVscyB3aXRoIGsgPj01CmRhdF9TZm0gPC0gZGF0ICU+JQogIGZpbHRlcihUeXBlX2Fzc2F5ICVpbiUgYygiUmVjb2duaXRpb24iLCAiSGFiaXR1YXRpb24iLCAiQ29uZGl0aW9uaW5nIiksCiAgICAgICAgIFR5cGVfcmVpbmZvcmNlbWVudCAlaW4lIGMoIkFwcGV0aXRpdmUiLCAiQXZlcnNpdmUiLCAiTm90IGFwcGxpY2FibGUiKSwKICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgJWluJSBjKCJSZXN0cmFpbnQiLCAiTm9pc2UiLCAiTVMiLCAiQ29tYmluYXRpb24iKSwKICAgICAgICAgU3RyZXNzX2R1cmF0aW9uICVpbiUgYygiQ2hyb25pYyIsICJBY3V0ZSIpKQoKI1ZDVl9TZm0gPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0X1NmbSRsblJSVl9FLCBjbHVzdGVyID0gZGF0X1NmbSRTdHVkeV9JRCwgciA9IDAuNSkKICAgICAgICAgICAgICAgICAKbW9kX1NmbSA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1NmbSwgbW9kID0gfiBUeXBlX2Fzc2F5IC0xICsgTGVhcm5pbmdfdnNfbWVtb3J5ICsgVHlwZV9yZWluZm9yY2VtZW50ICsgVHlwZV9zdHJlc3NfZXhwb3N1cmUgKyBBZ2Vfc3RyZXNzX2V4cG9zdXJlICsgU3RyZXNzX2R1cmF0aW9uLCByYW5kb20gPSAgIGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdF9TZm0pCiNzdW1tYXJ5KG1vZF9TZm0pCiNyMl9tbChtb2RfU2ZtKSAKCnJlc19TZm0gPC0gZHJlZGdlKG1vZF9TZm0sIHRyYWNlPTIpCnNhdmVSRFMocmVzX1NmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgInJlc19TZm0ucmRzIikpCiMgYWxzbyBzYXZpbmcgdGhlIGZ1bGwgbW9kZWwgYW5kIGRhdGEKc2F2ZVJEUyhtb2RfU2ZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAibW9kX1NmbS5yZHMiKSkKc2F2ZVJEUyhkYXRfU2ZtLCBmaWxlID0gaGVyZSgiUmRhdGEiLCAiZGF0X1NmbS5yZHMiKSkKYGBgCgpUaGUgYWthaWtlIHdlaWdodHMgZm9yIHRoZSB0b3Agc2V0IG9mIG1vZGVscyB3aXRoIEFJQyA8IDYKCmBgYHtyfQpkYXRfU2ZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgImRhdF9TZm0ucmRzIikpCm1vZF9TZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAibW9kX1NmbS5yZHMiKSkKcmVzX1NmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJyZXNfU2ZtLnJkcyIpKQpyZXNfU2ZtMjwtIHN1YnNldChyZXNfU2ZtLCBkZWx0YSA8PSA2LCByZWNhbGMud2VpZ2h0cz1GQUxTRSkKaW1wb3J0YW5jZShyZXNfU2ZtMikgCmBgYAoKIyMjIyBGdW5uZWwgcGxvdApXZSBwcm9kdWNlZCBmdW5uZWwgcGxvdHMgb2YgZWZmZWN0IHNpemVzIGFnYWluc3QgdGhlIHJlc2lkdWFscyBvZiB0aGUgZnVsbCBtb2RlbCB0byB2aXN1YWxseSBpbnNwZWN0IGZvciBmdW5uZWwgYXN5bW1ldHJ5LgoKVXNlZCB0byBwcm9kdWNlIEZpZy4gN2IKCmBgYCB7cn0KIyBmdW5uZWwgcGxvdApGdW5uZWxfUyA8LSBmdW5uZWwobW9kX1NmbSwgeGxhYiA9ICJsblJSIiwgeWxhYiA9ICJTdGFuZGFyZCBFcnJvciIpCiNGdW5uZWxfUwpgYGAKKipGaWcuN2IqKiBGdW5uZWwgcGxvdCBzaG93aW5nIHRoZSBzdGFuZGFyZCBlcnJvciBhbmQgcmVzaWR1YWxzIChsblJSKSBmcm9tIHRoZSBmdWxsIG1vZGVsLgoKIyMjIyBFZ2dlcidzIHJlZ3Jlc3Npb24gYW5kIHRpbWUtbGFnIGJpYXMKV2UgZml0dGVkIGVmZmVjdGl2ZSBzYW1wbGUgc2l6ZSBjYWxjdWxhdGVkIGFzOgoKJCQKXHNxcnR7XGZyYWMgezF9IHsgXHRpbGRle059IH19ICA9ClxzcXJ0e1xmcmFjIHsxfSB7IE5fXHRleHR7RVN9fSArIFxmcmFjezF9e05fXHRleHR7RUN9fSArIApcZnJhYyB7MX17Tl9cdGV4dHtDU319ICsgXGZyYWN7MX17Tl9cdGV4dHtDQ319fSwKJCQKCmFuZCB5ZWFyIG9mIHB1YmxpY2F0aW9uIGFzIG1vZGVyYXRvcnMgaW4gdGhlIGZ1bGwgbW9kZWwgdG8gaW5mZXJlbnRpYWxseSB0ZXN0IGZvciBmdW5uZWwgYXN5bW1ldHJ5IGFuZCBhIGRlY3JlYXNlIGluIGVmZmVjdCBzaXplcyB3aXRoIHB1YmxpY2F0aW9uIHllYXIuCgpgYGB7cn0KI2NhbGN1bGF0aW5nIGludiBlZmZlY3RpdmUgc2FtcGxlIHNpemUgZm9yIHVzZSBpbiBmdWxsIG1ldGEtcmVncmVzc2lvbgpWQ1ZfU2ZtIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdF9TZm0kbG5SUlZfRSwgY2x1c3RlciA9IGRhdF9TZm0kU3R1ZHlfSUQsIHIgPSAwLjUpCgpkYXRfU2ZtJHNxcnRfaW52X2VfbiA8LSB3aXRoKGRhdF9TZm0sIHNxcnQoMS9DQ19uICsgMS9FQ19uICsgMS9FU19uICsgMS9DU19uKSkKCiN0aW1lIGxhZyBiaWFzIGFuZCBlZ2dlcnMgcmVncmVzc2lvbgpkYXRfU2ZtJGNfWWVhcl9wdWJsaXNoZWQgPC0gYXMudmVjdG9yKHNjYWxlKGRhdF9TZm0kWWVhcl9wdWJsaXNoZWQsIHNjYWxlID0gRikpCgpQQl9NUl9TPC0gcm1hLm12KGxuUlJfU2EsIFZDVl9TZm0sIG1vZHMgPSB+MSArIHNxcnRfaW52X2VfbiArICBjX1llYXJfcHVibGlzaGVkICsgVHlwZV9hc3NheSArTGVhcm5pbmdfdnNfbWVtb3J5ICsgVHlwZV9yZWluZm9yY2VtZW50ICsgVHlwZV9zdHJlc3NfZXhwb3N1cmUgKyBBZ2Vfc3RyZXNzX2V4cG9zdXJlICsgU3RyZXNzX2R1cmF0aW9uLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLCAKICAgICAgICAgICAgICAgICBtZXRob2QgPSAiUkVNTCIsIAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsIAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRfU2ZtLAogICAgICAgICAgICAgICAgICBjb250cm9sPWxpc3Qob3B0aW1pemVyPSJvcHRpbSIsIG9wdG1ldGhvZD0iTmVsZGVyLU1lYWQiKSkKCiNQQl9NUl9TCgplc3RpbWF0ZXNfUEJfTVJfUzwtIGVzdGltYXRlcy5DSShQQl9NUl9TKQplc3RpbWF0ZXNfUEJfTVJfUwoKYGBgCgoKIyMjIyBMZWF2ZS1vbmUtb3V0IHNlbnNpdGl2aXR5IGFuYWx5c2lzCldlIGluZGl2aWR1YWxseSByZW1vdmVkIHN0dWRpZXMgdG8gZGV0ZXJtaW5lIGlmIGFueSBzaW5ndWxhciBzdHVkaWVzIGh2ZSBhIGRpc3Byb3BvcnRpb25hdGUgZWZmZWN0IG9uIHRoZSBtZXRhLWFuYWx5dGljIG1lYW4gYW5kIENJLgoKYGBgIHtyLCBldmFsID0gRkFMU0V9CmRhdCRTdHVkeV9JRCA8LSBhcy5mYWN0b3IoZGF0JFN0dWR5X0lEKQoKTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZSA8LSBsaXN0KCkKZm9yKGkgaW4gMTpsZW5ndGgobGV2ZWxzKGRhdCRTdHVkeV9JRCkpKXsKICBkIDwtIGRhdCAlPiUgZmlsdGVyKFN0dWR5X0lEICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldKQogIAogIFZDVl9TYiA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkJGxuUlJWX0UsIGNsdXN0ZXIgPSBkJFN0dWR5X0lELCByID0gMC41KQogIAogIExlYXZlT25lT3V0X2VmZmVjdHNpemVbW2ldXSA8LSBybWEubXYoeWkgPSBsblJSX1NhLCBWID0gVkNWX1NiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IGxpc3QofjEgfCBTdHVkeV9JRCx+MXwgRVNfSUQsIH4xIHwgU3RyYWluKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiUkVNTCIsIGRhdGEgPSBkYXRbZGF0JFN0dWR5X0lECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gbGV2ZWxzKGRhdCRTdHVkeV9JRClbaV0sIF0pfQoKCiMgd3JpdGluZyBmdW5jdGlvbiBmb3IgZXh0cmFjdGluZyBlc3QsIGNpLmxiLCBhbmQgY2kudWIgZnJvbSBhbGwgbW9kZWxzCmVzdC5mdW5jIDwtIGZ1bmN0aW9uKG1vZF9TMCl7CiAgZGYgPC0gZGF0YS5mcmFtZShlc3QgPSBtb2RfUzAkYiwgbG93ZXIgPSBtb2RfUzAkY2kubGIsIHVwcGVyID0gbW9kX1MwJGNpLnViKQogIHJldHVybihkZikKfQoKCiN1c2luZyBkcGx5ciB0byBmb3JtIGRhdGEgZnJhbWUKTUFfQ1ZSX1MgPC0gbGFwcGx5KExlYXZlT25lT3V0X2VmZmVjdHNpemUsIGZ1bmN0aW9uKHgpIGVzdC5mdW5jKHgpKSU+JSBiaW5kX3Jvd3MgJT4lIG11dGF0ZShsZWZ0X291dCA9IGxldmVscyhkYXQkU3R1ZHlfSUQpKQoKc2F2ZVJEUyhNQV9DVlJfUyxmaWxlID0gaGVyZSgiUmRhdGEiLCAiTUFfQ1ZSX1MucmRzIikpCgpgYGAKClVzZWQgdG8gcHJvZHVjZSBGaWcuIFM0CmBgYCB7cn0KTUFfQ1ZSX1MgPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAiTUFfQ1ZSX1MucmRzIikpCgojdGVsbGluZyBnZ3Bsb3QgdG8gc3RvcCByZW9yZGVyaW5nIGZhY3RvcnMKTUFfQ1ZSX1MkbGVmdF9vdXQ8LSBhcy5mYWN0b3IoTUFfQ1ZSX1MkbGVmdF9vdXQpCk1BX0NWUl9TJGxlZnRfb3V0PC1mYWN0b3IoTUFfQ1ZSX1MkbGVmdF9vdXQsIGxldmVscyA9IE1BX0NWUl9TJGxlZnRfb3V0KQoKI3Bsb3R0aW5nCmxlYXZlb25lb3V0X1MgPC0gZ2dwbG90KE1BX0NWUl9TKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMiwgbHdkID0gMSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9TMCRjaS5sYiwgbHR5ID0gMywgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9TMCRiLCBsdHkgPSAxLCBsd2QgPSAwLjc1LCBjb2xvdXIgPSAiYmxhY2siKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbW9kX1MwJGNpLnViLCBsdHkgPSAzLCBsd2QgPSAwLjc1LCBjb2xvdXIgPSAiYmxhY2siKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh4ID0gbGVmdF9vdXQsIHkgPSBlc3QsIHltaW4gPSBsb3dlciwgeW1heCA9IHVwcGVyKSkgKwogIHhsYWIoIlN0dWR5IGxlZnQgb3V0IikgKyAKICB5bGFiKCJsblJSLCA5NSUgQ0kiKSArIAogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgdGhlbWVfYncoKSArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCkgKSArCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKQoKbGVhdmVvbmVvdXRfUwoKZGF0JFN0dWR5X0lEIDwtIGFzLmludGVnZXIoZGF0JFN0dWR5X0lEKQpgYGAKKipGaWcuIFM0KiogTGVhdmUtb25lLWdyb3VwLW91dCBhbmFseXNpcyBzaG93aW5nIG1ldGEtYW5hbHl0aWMgbWVhbiBhbmQgOTUlIENJIHdoZW4gZWFjaCBpbmRpdmlkdWFsIHN0dWR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgZGF0YSBzZXQuIAoKIyMjIyBVc2luZyBTTUQKV2UgcmUtcmFuIHRoZSBtYWluIGVmZmVjdCBvZiBzdHJlc3MgbWV0YS1hbmFseXRpYyBtb2RlbCB1c2luZyBzdGFuZGFyZGlzZWQgbWVhbiBkaWZmZXJlbmNlIChTTUQpIGluc3RlYWQgb2YgbG5SUgoKYGBgIHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KbW9kX1MwYSA8LSBybWEubXYoeWkgPSBTTURfU2EsIFYgPSBWQ1ZfU2EsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kX1MwYSkgCmkyX21sKG1vZF9TMGEpIAoKYGBgCgojIyMjIFJpc2sgb2YgQmlhcwoKSW5jbHVkaW5nIGlmIHRoZSBzdHVkeSB3YXMgcmFuZG9taXNlZCBhcyBhIG1vZGVyYXRvciBhbmQgY29uZHVjdGluZyBhIHBhaXItd2lzZSBjb250cmFzdAoKYGBgIHtyLCByZXN1bHRzID0gJ2hpZGUnfQptb2RfcmFuZG9taXNlZF9TPC0gcm1hLm12KHlpID0gbG5SUl9TYSwgViA9IFZDVl9TLCBtb2QgPSB+Uk9CX3JhbmRvbWlzYXRpb24tMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX3JhbmRvbWlzZWRfUykKcjJfbWwobW9kX3JhbmRvbWlzZWRfUykgCgpgYGAKCmBgYCB7cn0KY29udHJhX21vZF9yYW5kb21pc2VkX1MgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQsIHJlc3BvbnNlID0gbG5SUl9TYSwgbW9kZXJhdG9yID0gUk9CX3JhbmRvbWlzYXRpb24sIFZDViA9IFZDVl9TKQpyZXNfdGFibGVfbW9kX3JhbmRvbWlzZWRfUyA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfcmFuZG9taXNlZF9TLCBjb250cmEgPSBjb250cmFfbW9kX3JhbmRvbWlzZWRfUywgbW9kZXJhdG9yID0gUk9CX3JhbmRvbWlzYXRpb24pCgpyZXNfdGFibGVfbW9kX3JhbmRvbWlzZWRfUwpgYGAKCkluY2x1ZGluZyBpZiB0aGUgc3R1ZHkgdXNlZCBibGluZGluZyBhbmQgY29uZHVjdGluZyBhIHBhaXItd2lzZSBjb250cmFzdAoKYGBgIHtyLCByZXN1bHRzID0gJ2hpZGUnfQptb2RfYmxpbmRpbmdfUzwtIHJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfUywgbW9kID0gflJPQl9ibGluZGluZy0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IixkYXRhID0gZGF0KQoKc3VtbWFyeShtb2RfYmxpbmRpbmdfUykKcjJfbWwobW9kX2JsaW5kaW5nX1MpIAoKYGBgCgpgYGAge3J9CmNvbnRyYV9tb2RfYmxpbmRpbmdfUyA8LSBjb250cmFzdF9mdW4oZGF0YSA9IGRhdCwgcmVzcG9uc2UgPSBsblJSX1NhLCBtb2RlcmF0b3IgPSBST0JfYmxpbmRpbmcsIFZDViA9IFZDVl9TKQpyZXNfdGFibGVfbW9kX2JsaW5kaW5nX1MgPC0gZ2V0X2VzdGltYXRlKG1vZGVsID0gbW9kX2JsaW5kaW5nX1MsIGNvbnRyYSA9IGNvbnRyYV9tb2RfYmxpbmRpbmdfUywgbW9kZXJhdG9yID0gUk9CX2JsaW5kaW5nKQoKcmVzX3RhYmxlX21vZF9ibGluZGluZ19TCmBgYAoKIyMgSW50ZXJhY3Rpb246IGVucmljaG1lbnQgeCBzdHJlc3MKCiMjIyBNZXRhLWFuYWx5c2lzClRvIHF1YW50aWZ5IGRpZmZlcmVuY2VzIGluIGluZGl2aWR1YWwgcGVyZm9ybWFuY2UgaW4gY29nbml0aXZlIGFzc2F5IHdpdGggdGhlIGludGVyYWN0aW9uIG9mIGVudmlyb25tZW50YWwgZW5yaWNobWVudCBhbmQgc3RyZXNzLCB3ZSB1c2VkIHRoZSBsb2dhcml0aG0gb2YgcmVzcG9uc2UgcmF0aW8gKGxuUlIpIGNhbGN1bGF0ZWQgYXM6IAoKJCQKXGxue1x0ZXh0e1JSfV9cdGV4dHtpbnRlcmFjdGlvbn19IAo9IFxsZWZ0KFxsbiBNX1x0ZXh0e0VTfSAtICBcbG4gTV9cdGV4dHtDU30gIFxyaWdodCkgLSAKXGxlZnQoIFxsbiBNX1x0ZXh0e0VDfSAtICBcbG4gTV9cdGV4dHtDQ30gXHJpZ2h0KQo9IApcbG4gXGxlZnQoIFxmcmFjIHtNX1x0ZXh0e0VTfSAvIE1fXHRleHR7Q1N9IH0gCntNX1x0ZXh0e0VDfSAvIFwgTV9cdGV4dHtDQ319IFxyaWdodCkKJCQKClZhcmlhbmNlIHdhcyBjYWxjdWxhdGVkIGFzOgoKJCQKXHRleHR7dmFyfShcbG57XHRleHR7UlJ9X1x0ZXh0e2ludGVyYWN0aW9ufX0pID0KXGZyYWMge1NEX1x0ZXh0e0VTfV4yfSB7IE5fXHRleHR7RVN9IE1fXHRleHR7RVN9XjIgfSArIFxmcmFje1NEX1x0ZXh0e0VDfV4yfXtOX1x0ZXh0e0VDfU1fXHRleHR7RUN9XjJ9ICsgClxmcmFjIHtTRF9cdGV4dHtDU31eMn17Tl9cdGV4dHtDU30gTV9cdGV4dHtDU31eMn0gKyBcZnJhY3tTRF9cdGV4dHtDQ31eMn17Tl9cdGV4dHtDQ30gTV9cdGV4dHtDQ31eMn0uCiQkClZhcmlhbmNlIHdhcyBjb252ZXJ0ZWQgaW4gdG8gdmFyaWFuY2UtY292YXJpYW5jZSAoVkNWKSBtYXRyaXggKHNlZSBhYm92ZSBpbiAnRGF0YSBvcmdhbmlzYXRpb24nKSB0byBjb250cm9sIGZvciBub24taW5kZXBlbmRlbmNlIGluIHNhbXBsaW5nIHZhcmlhbmNlIGZyb20gdGhlIHNhbWUgc3R1ZGllcy4KCmBgYCB7cn0KbW9kX0VTMCA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FUzApIAppMl9tbChtb2RfRVMwKSAKCm9yY2hhcmRfcGxvdChtb2RfRVMwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNSwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkgCmBgYGAKKipGaWcuIDMqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyBtZXRhLWFuYWx5dGljIG1lYW4gYW5kIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLiAKCiMjIyAgTWV0YS1yZWdyZXNzaW9uOiB1bmktbW9kZXJhdG9yIHsudGFic2V0fQpUbyBleHBsYWluIHNvbWUgb2YgdGhlIHVuZXhwbGFpbmVkIHZhcmlhdGlvbiBpbiB0aGUgaW50ZXJhY3Rpb24gb2YgZW52aXJvbm1lbnRhbCBlbnJpY2htZW50IGFuZCBzdHJlc3MsIHdlIGNvbmR1Y3RlZCBhIHNlcmllcyBvZiB1bmktbW9kZXJhdG9yIGFuYWx5c2VzLiBXZSBjYWxjdWxhdGVkIG1hcmdpbmFsIFIyIGZvciBlYWNoIG1vZGVyYXRvciBhcyB3ZWxsIGFzIGNvbmR1Y3RlZCBhIHNlcmllcyBvZiBwYWlyLXdpc2UgY29udHJhc3RzIGJldHdlZW4gaW4gbW9kZXJhdG9yIGNhdGVnb3J5LiAKCkFueSBtb2RlcmF0b3IgY2F0ZWdvcmllcyB3aXRoIGsgPCA1IHdlcmUgcmVtb3ZlZC4KCiMjIyMgTGVhcm5pbmcgdnMgTWVtb3J5CldhcyB0aGUgcmVzcG9uc2UgbGVhcm5pbmcgb3IgbWVtb3J5PwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KbW9kX0VTMSA8LSAgcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVMsIG1vZCA9IH5MZWFybmluZ192c19tZW1vcnktMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX0VTMSkgCnIyX21sKG1vZF9FUzEpIAoKTHZzTV9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTMSwgbW9kID0gIkxlYXJuaW5nX3ZzX21lbW9yeSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpMdnNNX0VTIApgYGAKKipGaWcuIDZhKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdMZWFybmluZ192c19tZW1vcnknIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuIAoKIyMjIyMgQ29udHJhc3RzCmBgYCB7cn0KY29udHJhX21vZF9FUzEgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQsIHJlc3BvbnNlID0gbG5SUl9FU2EsIG1vZGVyYXRvciA9TGVhcm5pbmdfdnNfbWVtb3J5LCBWQ1YgPSBWQ1ZfRVMpCnJlc190YWJsZV9tb2RfRVMxIDwtIGdldF9lc3RpbWF0ZShtb2RlbCA9IG1vZF9FUzEsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRVMxLCBtb2RlcmF0b3IgPSBMZWFybmluZ192c19tZW1vcnkpCgpyZXNfdGFibGVfbW9kX0VTMQpgYGAKCiMjIyMgVHlwZSBvZiBhc3NheQpUaGUgYnJvYWQgY2F0ZWdvcnkgb2YgdGhlIHR5cGUgb2YgYXNzYXkgdXNlZCB0byBtZWFzdXJlIGxlYXJuaW5nIG9yIG1lbW9yeSAKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9FUzEgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0MSRsblJSVl9FUywgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FUzIgPC0gcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVMxLCBtb2QgPSB+VHlwZV9hc3NheS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDEpCgpzdW1tYXJ5KG1vZF9FUzIpCnIyX21sKG1vZF9FUzIpIAoKTGVhcm5pbmdfRVMgPC0gb3JjaGFyZF9wbG90KG1vZF9FUzIsIG1vZCA9ICJUeXBlX2Fzc2F5IiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogICAgZ2VvbV9zaWduaWYoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkNvbmRpdGlvbmluZyIsICJSZWNvZ25pdGlvbiIpKSwKICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9ICIqIikgKwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCkxlYXJuaW5nX0VTCmBgYAoqKkZpZy4gNmIqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ1R5cGVfYXNzYXknIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMjIyBDb250cmFzdHMKYGBgIHtyfQpjb250cmFfbW9kX0VTMiA8LSBjb250cmFzdF9mdW4oZGF0YSA9IGRhdDEsIHJlc3BvbnNlID0gbG5SUl9FU2EsIG1vZGVyYXRvciA9VHlwZV9hc3NheSwgVkNWID0gVkNWX0VTMSkKcmVzX3RhYmxlX21vZF9FUzIgPC0gZ2V0X2VzdGltYXRlKG1vZGVsID0gbW9kX0VTMiwgY29udHJhID0gY29udHJhX21vZF9FUzIsIG1vZGVyYXRvciA9IFR5cGVfYXNzYXkpCgpyZXNfdGFibGVfbW9kX0VTMgpgYGAKCiMjIyMgVHlwZSBvZiByZWluZm9yY2VtZW50CklmIGNvbmRpdGlvbmluZyB3YXMgdXNlZCwgd2FzIGF2ZXJzaXZlIG9yIGFwcGV0aXRpdmUgcmVpbmZvcmNlbWVudCB1c2VkPwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTMiA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQyJGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0MiRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FUzMgPC0gcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVMyLCBtb2QgPSB+IFR5cGVfcmVpbmZvcmNlbWVudC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQyKQoKc3VtbWFyeShtb2RfRVMzKQpyMl9tbChtb2RfRVMzKSAKClJlaW5mb3JjZW1lbnRfRVMgPC0gb3JjaGFyZF9wbG90KG1vZF9FUzMsIG1vZCA9ICJUeXBlX3JlaW5mb3JjZW1lbnQiLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgICBnZW9tX3NpZ25pZihjb21wYXJpc29ucyA9IGxpc3QoYygiQXZlcnNpdmUiLCAiTm90IGFwcGxpY2FibGUiKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSAiKiIpICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpSZWluZm9yY2VtZW50X0VTIApgYGBgCioqRmlnLiA2YyoqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnVHlwZV9yZWluZm9yY2VtZW50JyB3aXRoIHRoZWlyIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLgoKIyMjIyMgQ29udHJhc3RzCmBgYCB7cn0KY29udHJhX21vZF9FUzMgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQyLCByZXNwb25zZSA9IGxuUlJfRVNhLCBtb2RlcmF0b3IgPVR5cGVfcmVpbmZvcmNlbWVudCwgVkNWID0gVkNWX0VTMikKcmVzX3RhYmxlX21vZF9FUzMgPC0gZ2V0X2VzdGltYXRlKG1vZGVsID0gbW9kX0VTMywgY29udHJhID0gY29udHJhX21vZF9FUzMsIG1vZGVyYXRvciA9IFR5cGVfcmVpbmZvcmNlbWVudCkKCnJlc190YWJsZV9tb2RfRVMzCmBgYAoKIyMjIyBBZ2Ugb2YgZW5yaWNobWVudApUaGUgYWdlIHdoZW4gaW5kaXZpZHVhbHMgd2VyZSBleHBvc2VkIHRvIGVudmlyb25tZW50YWwgZW5yaWNobWVudAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTMyA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQzJGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0MyRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FUzQgPC0gcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVMzLCBtb2QgPSB+QWdlX0VFX2V4cG9zdXJlLTEsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDMpCgpzdW1tYXJ5KG1vZF9FUzQpIApyMl9tbChtb2RfRVM0KSAKCkFnZV9lbnJpY2htZW50X0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVM0LCBtb2QgPSAiQWdlX0VFX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgIyBjaGFuZ2UgZm9udCBzaXplcwogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpIAoKQWdlX2VucmljaG1lbnRfRVMKYGBgCioqRmlnLiA2ZCoqIE9yY2hhcmQgcGxvdCBzaG93aW5nIHRoZSBncm91cC13aXNlIG1lYW5zIG9mIHRoZSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAnQWdlX0VFX2V4cG9zdXJlJyB3aXRoIHRoZWlyIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLgoKIyMjIyMgQ29udHJhc3RzCmBgYCB7cn0KY29udHJhX21vZF9FUzQgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQzLCByZXNwb25zZSA9IGxuUlJfRVNhLCBtb2RlcmF0b3IgPUFnZV9FRV9leHBvc3VyZSwgVkNWID0gVkNWX0VTMykKcmVzX3RhYmxlX21vZF9FUzQgPC0gZ2V0X2VzdGltYXRlKG1vZGVsID0gbW9kX0VTNCwgY29udHJhID0gY29udHJhX21vZF9FUzQsIG1vZGVyYXRvciA9IEFnZV9FRV9leHBvc3VyZSkKCnJlc190YWJsZV9tb2RfRVM0CmBgYAoKIyMjIyBFeGVyY2lzZSBlbnJpY2htZW50CkRpZCBlbnJpY2htZW50IGludm9sdmUgdGhlIGFkZGl0aW9uIG9mIGFwcGFyYXR1cyBmb3Igdm9sdW50YXJ5IGV4ZXJjaXNlIChlLmcuLCBhIHdoZWVsIG9yIHRyZWFkbWlsbCk/CgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRVM1PC0gcm1hLm12KHlpID0gbG5SUl9FU2EsIFYgPSBWQ1ZfRVMsIG1vZCA9IH5FRV9leGVyY2lzZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELCAKICAgIH4xfEVTX0lELAogICAgfjF8U3RyYWluKSwKICAgICB0ZXN0ID0gInQiLAogICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FUzUpCnIyX21sKG1vZF9FUzUpIAoKRXhlcmNpc2VfRVMgPC0gb3JjaGFyZF9wbG90KG1vZF9FUzUsIG1vZCA9ICJFRV9leGVyY2lzZSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCkV4ZXJjaXNlX0VTCmBgYAoqKkZpZy4gNmQqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ0VFX2V4ZXJjaXNlJyB3aXRoIHRoZWlyIDk1JSBjb25maWRlbmNlIGludGVydmFsICh0aGluayBibGFjayBsaW5lKSBhbmQgOTUlIHByZWRpY3Rpb24gaW50ZXJ2YWwgKHRoaW4gYmxhY2sgbGluZSkuIEluZGl2aWR1YWxzIHBvaW50cyBzaG93IG9ic2VydmVkIGVmZmVjdCBzaXplcyBhbmQgc2FtcGxlIHNpemVzLgoKIyMjIyMgQ29udHJhc3RzCmBgYCB7cn0KY29udHJhX21vZF9FUzUgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQsIHJlc3BvbnNlID0gbG5SUl9FU2EsIG1vZGVyYXRvciA9RUVfZXhlcmNpc2UsIFZDViA9IFZDVl9FUykKcmVzX3RhYmxlX21vZF9FUzUgPC0gZ2V0X2VzdGltYXRlKG1vZGVsID0gbW9kX0VTNSwgY29udHJhID0gY29udHJhX21vZF9FUzUsIG1vZGVyYXRvciA9IEVFX2V4ZXJjaXNlKQoKcmVzX3RhYmxlX21vZF9FUzUKYGBgCgojIyMjIFNvY2lhbCBlbnJpY2htZW50CkRpZCBlbnJpY2htZW50IGludm9sdmUgbW9yZSBjb25zcGVjaWZpY3MgKG5vdGUgdGhhdCB3ZSBkaWQgbm90IGluY2x1ZGUgc3R1ZGllcyB0aGF0IG9ubHkgcHJvdmlkZWQgc29jaWFsIGVucmljaG1lbnQgYnV0IG5vIG90aGVyIGZvcm0gb2YgYWJpb3RpYyBlbnJpY2htZW50KT8KCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9FUzQgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0NCRsblJSVl9FUywgY2x1c3RlciA9IGRhdDQkU3R1ZHlfSUQsIHIgPSAwLjUpCm1vZF9FUzY8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUzQsIG1vZCA9IH5FRV9zb2NpYWwtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDQpCgpzdW1tYXJ5KG1vZF9FUzYpCnIyX21sKG1vZF9FUzYpIAoKU29jaWFsX0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVM2LCBtb2QgPSAiRUVfc29jaWFsIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKClNvY2lhbF9FUwpgYGAKKipGaWcuIDZlKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdFRV9zb2NpYWwnIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMjIyBDb250cmFzdHMKYGBgIHtyfQpjb250cmFfbW9kX0VTNiA8LSBjb250cmFzdF9mdW4oZGF0YSA9IGRhdDQsIHJlc3BvbnNlID0gbG5SUl9FU2EsIG1vZGVyYXRvciA9RUVfc29jaWFsLCBWQ1YgPSBWQ1ZfRVM0KQpyZXNfdGFibGVfbW9kX0VTNiA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfRVM2LCBjb250cmEgPSBjb250cmFfbW9kX0VTNiwgbW9kZXJhdG9yID0gRUVfc29jaWFsKQoKcmVzX3RhYmxlX21vZF9FUzYKYGBgCgojIyMjIEFnZSBvZiBzdHJlc3MKVGhlIGFnZSB3aGVuIGluZGl2aWR1YWxzIHdlcmUgZXhwb3NlZCB0byBzdHJlc3MKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9Cm1vZF9FUzcgPC1ybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgbW9kID0gfkFnZV9zdHJlc3NfZXhwb3N1cmUtMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9FUzcpIApyMl9tbChtb2RfRVM3KSAKCkFnZV9zdHJlc3NfRVM8LW9yY2hhcmRfcGxvdChtb2RfRVM3LCBtb2QgPSAiQWdlX3N0cmVzc19leHBvc3VyZSIsIHhsYWIgPSAibG5SUiIsIGFscGhhPTAuNCkgKyAKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyUFIsIHhtYXggPSB1cHBlclBSKSwgaGVpZ2h0ID0gMCwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDEuMSwgYWxwaGEgPSAwLjUpICsgIyBwcmVkaWN0aW9uIGludGVydmFscwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJDTCwgeG1heCA9IHVwcGVyQ0wpLCBoZWlnaHQgPSAwLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMikgKyAjIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiLCAiZ3JleTM0IikpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IiwiZ3JleTM0IikpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gMywgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgCgpBZ2Vfc3RyZXNzX0VTCmBgYAoqKkZpZy4gNmQqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ0FnZV9zdHJlc3NfZXhwb3N1cmUnIHdpdGggdGhlaXIgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKHRoaW5rIGJsYWNrIGxpbmUpIGFuZCA5NSUgcHJlZGljdGlvbiBpbnRlcnZhbCAodGhpbiBibGFjayBsaW5lKS4gSW5kaXZpZHVhbHMgcG9pbnRzIHNob3cgb2JzZXJ2ZWQgZWZmZWN0IHNpemVzIGFuZCBzYW1wbGUgc2l6ZXMuCgojIyMjIyBDb250cmFzdHMKYGBgIHtyfQpjb250cmFfbW9kX0VTNyA8LSBjb250cmFzdF9mdW4oZGF0YSA9IGRhdCwgcmVzcG9uc2UgPSBsblJSX0VTYSwgbW9kZXJhdG9yID1BZ2Vfc3RyZXNzX2V4cG9zdXJlLCBWQ1YgPSBWQ1ZfRVMpCnJlc190YWJsZV9tb2RfRVM3IDwtIGdldF9lc3RpbWF0ZShtb2RlbCA9IG1vZF9FUzcsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRVM3LCBtb2RlcmF0b3IgPSBBZ2Vfc3RyZXNzX2V4cG9zdXJlKQoKcmVzX3RhYmxlX21vZF9FUzcKYGBgCgojIyMjIFR5cGUgb2Ygc3RyZXNzClRoZSB0eXBlIG9mIHN0cmVzc29yIHVzZWQKCmBgYCB7cn0KVkNWX0VTNSA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQ1JGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0NSRTdHVkeV9JRCwgciA9IDAuNSkKbW9kX0VTOCA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUzUsIG1vZCA9IH5UeXBlX3N0cmVzc19leHBvc3VyZS0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQ1KQpzdW1tYXJ5KG1vZF9FUzgpCnIyX21sKG1vZF9FUzgpCgpTdHJlc3Nvcl9FUyA8LSBvcmNoYXJkX3Bsb3QobW9kX0VTOCwgbW9kID0gIlR5cGVfc3RyZXNzX2V4cG9zdXJlIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIsICJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiLCJncmV5MzQiKSkgKwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYygxLCA3KSkrICMgY2hhbmdlIHBvaW50IHNjYWxpbmcKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgIAoKU3RyZXNzb3JfRVMgCmBgYGAKKipGaWcuIDZlKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdUeXBlX3N0cmVzc19leHBvc3VyZScgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMjIENvbnRyYXN0cwpgYGAge3J9CmNvbnRyYV9tb2RfRVM4IDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0NSwgcmVzcG9uc2UgPSBsblJSX0VTYSwgbW9kZXJhdG9yID1UeXBlX3N0cmVzc19leHBvc3VyZSwgVkNWID0gVkNWX0VTNSkKcmVzX3RhYmxlX21vZF9FUzggPC0gZ2V0X2VzdGltYXRlKG1vZGVsID0gbW9kX0VTOCwgY29udHJhID0gY29udHJhX21vZF9FUzgsIG1vZGVyYXRvciA9IFR5cGVfc3RyZXNzX2V4cG9zdXJlKQoKcmVzX3RhYmxlX21vZF9FUzgKYGBgCgojIyMjIFN0cmVzcyBkdXJhdGlvbgpXYXMgdGhlIHN0cmVzcyBhY3V0ZSBvciBjaHJvbmljPwoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX0VTNiA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQ2JGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0NiRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FUzkgPC1ybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUzYsIG1vZCA9IH5TdHJlc3NfZHVyYXRpb24tMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdDYpCnN1bW1hcnkobW9kX0VTOSkgCnIyX21sKG1vZF9FUzkpIAoKCkR1cmF0aW9uX0VTPC0gb3JjaGFyZF9wbG90KG1vZF9FUzksIG1vZCA9ICJTdHJlc3NfZHVyYXRpb24iLCB4bGFiID0gImxuUlIiLCBhbHBoYT0wLjQpICsgCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlclBSLCB4bWF4ID0gdXBwZXJQUiksIGhlaWdodCA9IDAsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAxLjEsIGFscGhhID0gMC41KSArICMgcHJlZGljdGlvbiBpbnRlcnZhbHMKICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGxvd2VyQ0wsIHhtYXggPSB1cHBlckNMKSwgaGVpZ2h0ID0gMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgc2l6ZSA9IDIpICsgIyBjb25maWRlbmNlIGludGVydmFscwogIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBuYW1lKSwgIHNpemUgPSAzLCBzaGFwZSA9IDIxKSsgIyBtZWFuIGVzdGltYXRlCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzQiLCJncmV5MzQiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmV5MzQiLCJncmV5MzQiKSkgKwogICAgZ2VvbV9zaWduaWYoY29tcGFyaXNvbnMgPSBsaXN0KGMoIkFjdXRlIiwgIkNocm9uaWMiKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSAiKiIpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCkR1cmF0aW9uX0VTCmBgYAoqKkZpZy4gNmYqKiBPcmNoYXJkIHBsb3Qgc2hvd2luZyB0aGUgZ3JvdXAtd2lzZSBtZWFucyBvZiB0aGUgY2F0ZWdvcmljYWwgdmFyaWFibGUgJ1N0cmVzc19kdXJhdGlvbicgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMjIENvbnRyYXN0cwpgYGAge3J9CmNvbnRyYV9tb2RfRVM5IDwtIGNvbnRyYXN0X2Z1bihkYXRhID0gZGF0NiwgcmVzcG9uc2UgPSBsblJSX0VTYSwgbW9kZXJhdG9yID1TdHJlc3NfZHVyYXRpb24sIFZDViA9IFZDVl9FUzYpCnJlc190YWJsZV9tb2RfRVM5IDwtIGdldF9lc3RpbWF0ZShtb2RlbCA9IG1vZF9FUzksIGNvbnRyYSA9IGNvbnRyYV9tb2RfRVM5LCBtb2RlcmF0b3IgPSBTdHJlc3NfZHVyYXRpb24pCgpyZXNfdGFibGVfbW9kX0VTOQpgYGAKCiMjIyMgT3JkZXIgdG8gdHJlYXRtZW50IGV4cG9zdXJlClRoZSBvcmRlciBpbiB3aGljaCBpbmRpdmlkdWFscyB3ZXJlIGV4cG9zZWQgdG8gZW5yaWNobWVudCBhbmQgc3RyZXNzCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQptb2RfRVMxMCA8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgbW9kID0gfkV4cG9zdXJlX29yZGVyIC0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELCAKICAgIH4xfEVTX0lELAogICAgfjF8U3RyYWluKSwKICAgICB0ZXN0ID0gInQiLAogICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9FUzEwKQpyMl9tbChtb2RfRVMxMCkKCk9yZGVyX0VTIDwtIG9yY2hhcmRfcGxvdChtb2RfRVMxMCwgbW9kID0gIkV4cG9zdXJlX29yZGVyIiwgeGxhYiA9ICJsblJSIiwgYWxwaGE9MC40KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZXkzNCIsImdyZXkzNCIsImdyZXkzNCIpKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IG5hbWUpLCAgc2l6ZSA9IDMsIHNoYXBlID0gMjEpKyAjIG1lYW4gZXN0aW1hdGUKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDEsIDcpKSsgIyBjaGFuZ2UgcG9pbnQgc2NhbGluZwogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsPU5BLCBzaXplPTEuMyksICMgYm9yZGVyIGFyb3VuZCB0aGUgcGxvdAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSAKCk9yZGVyX0VTIApgYGAKKipGaWcuIDZnKiogT3JjaGFyZCBwbG90IHNob3dpbmcgdGhlIGdyb3VwLXdpc2UgbWVhbnMgb2YgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlICdFeHBvc3VyZV9vcmRlcicgd2l0aCB0aGVpciA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAodGhpbmsgYmxhY2sgbGluZSkgYW5kIDk1JSBwcmVkaWN0aW9uIGludGVydmFsICh0aGluIGJsYWNrIGxpbmUpLiBJbmRpdmlkdWFscyBwb2ludHMgc2hvdyBvYnNlcnZlZCBlZmZlY3Qgc2l6ZXMgYW5kIHNhbXBsZSBzaXplcy4KCiMjIyMjIENvbnRyYXN0cwpgYGAge3J9CmNvbnRyYV9tb2RfRVMxMCA8LSBjb250cmFzdF9mdW4oZGF0YSA9IGRhdCwgcmVzcG9uc2UgPSBsblJSX0VTYSwgbW9kZXJhdG9yID1FeHBvc3VyZV9vcmRlciwgVkNWID0gVkNWX0VTKQpyZXNfdGFibGVfbW9kX0VTMTAgPC0gZ2V0X2VzdGltYXRlKG1vZGVsID0gbW9kX0VTMTAsIGNvbnRyYSA9IGNvbnRyYV9tb2RfRVMxMCwgbW9kZXJhdG9yID0gRXhwb3N1cmVfb3JkZXIpCgpyZXNfdGFibGVfbW9kX0VTMTAKYGBgCgoKIyMjIFB1YmxpY2F0aW9uIGJpYXMgJiBzZW5zaXRpdml0eSBhbmFseXNpcyB7LnRhYnNldH0KCiMjIyMgIE11bHRpLW1vZGVyYXRvciBtb2RlbApXZSByYW4gYSBtdWx0aS1tb2RlcmF0b3Ig4oCYZnVsbOKAmSBtb2RlbCBvZiBhbGwgbW9kZXJhdG9ycy4gV2UgcmFuIG1vZGVsIHNlbGVjdGlvbiBiYXNlZCBvbiBBSUMgYW5kIHNlbGVjdGVkIHRoZSB0b3Agc2V0IG9mIG1vZGVscyB3aXRoaW4gZGVsdGEgQUlDIG9mIDYgYW5kIGNhbGN1bGF0ZWQgdGhlIGltcG9ydGFuY2Ugb2YgZWFjaCBtb2RlcmF0b3IgKGkuZS4sIEFrYWlrZSB3ZWlnaHRzKSB3aXRoaW4gdGhpcyB0b3AgbW9kZWwgc2V0LgoKYGBgIHtyLCBldmFsID0gRkFMU0V9CmRhdF9FU2ZtIDwtIGRhdCAlPiUKICBmaWx0ZXIoVHlwZV9hc3NheSAlaW4lIGMoIlJlY29nbml0aW9uIiwgIkhhYml0dWF0aW9uIiwgIkNvbmRpdGlvbmluZyIpLAogICAgICAgICBUeXBlX3JlaW5mb3JjZW1lbnQgJWluJSBjKCJBcHBldGl0aXZlIiwgIkF2ZXJzaXZlIiwgIk5vdCBhcHBsaWNhYmxlIiksCiAgICAgICAgIEVFX3NvY2lhbCAlaW4lIGMoIlNvY2lhbCIsICJOb24tc29jaWFsIiksCiAgICAgICAgIEFnZV9FRV9leHBvc3VyZSAlaW4lIGMoIkFkdWx0IiwgIkFkb2xlc2NlbnQiKSwKICAgICAgICAgVHlwZV9zdHJlc3NfZXhwb3N1cmUgJWluJSBjKCJSZXN0cmFpbnQiLCAiTm9pc2UiLCAiTVMiLCAiQ29tYmluYXRpb24iKSwKICAgICAgICAgU3RyZXNzX2R1cmF0aW9uICVpbiUgYygiQ2hyb25pYyIsICJBY3V0ZSIpLCAKICAgICAgICAgQWdlX3N0cmVzc19leHBvc3VyZSAlaW4lIGMoIlByZW5hdGFsIiwgIkVhcmx5IHBvc3RuYXRhbCIsICJBZHVsdCIpKQoKI1ZDVl9FU2ZtIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdF9FU2ZtJGxuUlJWX0VTLCBjbHVzdGVyID0gZGF0X0VTZm0kU3R1ZHlfSUQsIHIgPSAwLjUpCiAgICAgICAgICAgICAgICAgCm1vZF9FU2ZtIDwtIHJtYS5tdih5aSA9IGxuUlJfU2EsIFYgPSBWQ1ZfRVNmbSwgbW9kID0gflR5cGVfYXNzYXktMSArIExlYXJuaW5nX3ZzX21lbW9yeSArIFR5cGVfcmVpbmZvcmNlbWVudCArIEVFX3NvY2lhbCArIEVFX2V4ZXJjaXNlICsgQWdlX0VFX2V4cG9zdXJlICsgVHlwZV9zdHJlc3NfZXhwb3N1cmUgKyBBZ2Vfc3RyZXNzX2V4cG9zdXJlICsgU3RyZXNzX2R1cmF0aW9uICsgRXhwb3N1cmVfb3JkZXIsIHJhbmRvbSA9ICAgbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksCiAgICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0X0VTZm0pCiNzdW1tYXJ5KG1vZF9FU2ZtKQojcjJfbWwobW9kX0VTZm0pIAoKCnJlc19FU2ZtIDwtIGRyZWRnZShtb2RfRVNmbSwgdHJhY2U9MikKc2F2ZVJEUyhyZXNfRVNmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgInJlc19FU2ZtLnJkcyIpKQojIGFsc28gc2F2aW5nIHRoZSBmdWxsIG1vZGVsIGFuZCBkYXRhCnNhdmVSRFMobW9kX0VTZm0sIGZpbGUgPSBoZXJlKCJSZGF0YSIsICJtb2RfRVNmbS5yZHMiKSkKc2F2ZVJEUyhkYXRfRVNmbSwgZmlsZSA9IGhlcmUoIlJkYXRhIiwgImRhdF9FU2ZtLnJkcyIpKQpgYGAKClRoZSBha2Fpa2Ugd2VpZ2h0cyBmb3IgdGhlIHRvcCBzZXQgb2YgbW9kZWxzIHdpdGggQUlDIDwgNgoKYGBge3J9CmRhdF9FU2ZtIDwtIHJlYWRSRFMoZmlsZSA9IGhlcmUoIlJkYXRhIiwgImRhdF9FU2ZtLnJkcyIpKQptb2RfRVNmbSA8LSByZWFkUkRTKGZpbGUgPSBoZXJlKCJSZGF0YSIsICJtb2RfRVNmbS5yZHMiKSkKcmVzX0VTZm0gPC0gcmVhZFJEUyhmaWxlID0gaGVyZSgiUmRhdGEiLCAicmVzX0VTZm0ucmRzIikpCnJlc19FU2ZtMjwtIHN1YnNldChyZXNfRVNmbSwgZGVsdGEgPD0gNiwgcmVjYWxjLndlaWdodHM9RkFMU0UpCmltcG9ydGFuY2UocmVzX0VTZm0yKSAKYGBgCgojIyMjIEZ1bm5lbCBwbG90CldlIHByb2R1Y2VkIGZ1bm5lbCBwbG90cyBvZiBlZmZlY3Qgc2l6ZXMgYWdhaW5zdCB0aGUgcmVzaWR1YWxzIG9mIHRoZSBmdWxsIG1vZGVsIHRvIHZpc3VhbGx5IGluc3BlY3QgZm9yIGZ1bm5lbCBhc3ltbWV0cnkuCgpVc2VkIHRvIHByb2R1Y2UgRmlnLiA3YwoKYGBgIHtyfQpGdW5uZWxfRVM8LWZ1bm5lbChtb2RfRVNmbSwgeGxhYiA9ICJsblJSIiwgeWxhYiA9ICJTdGFuZGFyZCBFcnJvciIpCiNGdW5uZWxfRVMKYGBgCioqRmlnLjdjKiogRnVubmVsIHBsb3Qgc2hvd2luZyB0aGUgc3RhbmRhcmQgZXJyb3IgYW5kIHJlc2lkdWFscyAobG5SUikgZnJvbSB0aGUgZnVsbCBtb2RlbC4KCiMjIyMgRWdnZXIncyByZWdyZXNzaW9uIGFuZCB0aW1lLWxhZyBiaWFzCldlIGZpdHRlZCBlZmZlY3RpdmUgc2FtcGxlIHNpemUgY2FsY3VsYXRlZCBhczoKCiQkClxzcXJ0e1xmcmFjIHsxfSB7IFx0aWxkZXtOfSB9fSAgPQpcc3FydHtcZnJhYyB7MX0geyBOX1x0ZXh0e0VTfX0gKyBcZnJhY3sxfXtOX1x0ZXh0e0VDfX0gKyAKXGZyYWMgezF9e05fXHRleHR7Q1N9fSArIFxmcmFjezF9e05fXHRleHR7Q0N9fX0sCiQkCgphbmQgeWVhciBvZiBwdWJsaWNhdGlvbiBhcyBtb2RlcmF0b3JzIGluIHRoZSBmdWxsIG1vZGVsIHRvIGluZmVyZW50aWFsbHkgdGVzdCBmb3IgZnVubmVsIGFzeW1tZXRyeSBhbmQgYSBkZWNyZWFzZSBpbiBlZmZlY3Qgc2l6ZXMgd2l0aCBwdWJsaWNhdGlvbiB5ZWFyLgoKCmBgYHtyfQojY2FsY3VsYXRpbmcgaW52IGVmZmVjdGl2ZSBzYW1wbGUgc2l6ZSBmb3IgdXNlIGluIGZ1bGwgbWV0YS1yZWdyZXNzaW9uCmRhdF9FU2ZtJHNxcnRfaW52X2VfbiA8LSB3aXRoKGRhdF9FU2ZtLCBzcXJ0KDEvQ0NfbiArIDEvRUNfbiArIDEvRVNfbiArIDEvQ1NfbikpCmRhdF9FU2ZtJGNfWWVhcl9wdWJsaXNoZWQgPC0gYXMudmVjdG9yKHNjYWxlKGRhdF9FU2ZtJFllYXJfcHVibGlzaGVkLCBzY2FsZSA9IEYpKQoKVkNWX0VTZm0gPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0X0VTZm0kbG5SUlZfRVMsIGNsdXN0ZXIgPSBkYXRfRVNmbSRTdHVkeV9JRCwgciA9IDAuNSkKICAgICAgICAgICAgICAKCiN0aW1lIGxhZyBiaWFzIGFuZCBlZ2dlcnMgcmVncmVzc2lvbgoKUEJfTVJfRVM8LSBybWEubXYobG5SUl9FU2EsIFZDVl9FU2ZtLCBtb2RzID0gfjEgKyBzcXJ0X2ludl9lX24gKyAgY19ZZWFyX3B1Ymxpc2hlZCArIFR5cGVfYXNzYXkgK0xlYXJuaW5nX3ZzX21lbW9yeSArIFR5cGVfcmVpbmZvcmNlbWVudCArIFR5cGVfc3RyZXNzX2V4cG9zdXJlICsgQWdlX3N0cmVzc19leHBvc3VyZSArIEVFX3NvY2lhbCArIEVFX2V4ZXJjaXNlICsgU3RyZXNzX2R1cmF0aW9uICsgRXhwb3N1cmVfb3JkZXIsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfFN0cmFpbiksIAogICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJSRU1MIiwgCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwgCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdF9FU2ZtLAogICAgICAgICAgICAgICAgICBjb250cm9sPWxpc3Qob3B0aW1pemVyPSJvcHRpbSIsIG9wdG1ldGhvZD0iTmVsZGVyLU1lYWQiKSkKCgplc3RpbWF0ZXNfUEJfTVJfRVM8LSBlc3RpbWF0ZXMuQ0koUEJfTVJfRVMpCmVzdGltYXRlc19QQl9NUl9FUwoKYGBgCgoKIyMjIyBMZWF2ZS1vbmUtb3V0IGFuYWx5c2lzCldlIGluZGl2aWR1YWxseSByZW1vdmVkIHN0dWRpZXMgdG8gZGV0ZXJtaW5lIGlmIGFueSBzaW5ndWxhciBzdHVkaWVzIGh2ZSBhIGRpc3Byb3BvcnRpb25hdGUgZWZmZWN0IG9uIHRoZSBtZXRhLWFuYWx5dGljIG1lYW4gYW5kIENJLgoKYGBgIHtyLCBldmFsID0gRkFMU0V9CmRhdCRTdHVkeV9JRCA8LSBhcy5mYWN0b3IoZGF0JFN0dWR5X0lEKQoKTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZSA8LSBsaXN0KCkKZm9yKGkgaW4gMTpsZW5ndGgobGV2ZWxzKGRhdCRTdHVkeV9JRCkpKXsKICBkIDwtIGRhdCAlPiUgZmlsdGVyKFN0dWR5X0lEICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldKQogIAogIFZDVl9FU2IgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZCRsblJSVl9FUywgY2x1c3RlciA9IGQkU3R1ZHlfSUQsIHIgPSAwLjUpCiAgTGVhdmVPbmVPdXRfZWZmZWN0c2l6ZVtbaV1dIDwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTYiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSBsaXN0KH4xIHwgU3R1ZHlfSUQsfjF8IEVTX0lELCB+MSB8IFN0cmFpbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIlJFTUwiLCBkYXRhID0gZGF0W2RhdCRTdHVkeV9JRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IGxldmVscyhkYXQkU3R1ZHlfSUQpW2ldLCBdKX0KCgojIHdyaXRpbmcgZnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgZXN0LCBjaS5sYiwgYW5kIGNpLnViIGZyb20gYWxsIG1vZGVscwplc3QuZnVuYyA8LSBmdW5jdGlvbihtb2RfRVMwKXsKICBkZiA8LSBkYXRhLmZyYW1lKGVzdCA9IG1vZF9FUzAkYiwgbG93ZXIgPSBtb2RfRVMwJGNpLmxiLCB1cHBlciA9IG1vZF9FUzAkY2kudWIpCiAgcmV0dXJuKGRmKQp9CgoKI3VzaW5nIGRwbHlyIHRvIGZvcm0gZGF0YSBmcmFtZQpNQV9DVlJfRVMgPC0gbGFwcGx5KExlYXZlT25lT3V0X2VmZmVjdHNpemUsIGZ1bmN0aW9uKHgpIGVzdC5mdW5jKHgpKSU+JSBiaW5kX3Jvd3MgJT4lIG11dGF0ZShsZWZ0X291dCA9IGxldmVscyhkYXQkU3R1ZHlfSUQpKQoKc2F2ZVJEUyhNQV9DVlJfRVMsICxmaWxlID0gaGVyZSgiUmRhdGEiLCAiTUFfQ1ZSX0VTLnJkcyIpKQoKYGBgClVzZWQgdG8gcHJvZHVjZSBGaWcuIFM1CgpgYGAge3J9Ck1BX0NWUl9FUzwtIHJlYWRSRFMoaGVyZSgiUmRhdGEiLCAiTUFfQ1ZSX0VTLnJkcyIpKQoKI3RlbGxpbmcgZ2dwbG90IHRvIHN0b3AgcmVvcmRlcmluZyBmYWN0b3JzCk1BX0NWUl9FUyRsZWZ0X291dDwtIGFzLmZhY3RvcihNQV9DVlJfRVMkbGVmdF9vdXQpCk1BX0NWUl9FUyRsZWZ0X291dDwtZmFjdG9yKE1BX0NWUl9FUyRsZWZ0X291dCwgbGV2ZWxzID0gTUFfQ1ZSX0VTJGxlZnRfb3V0KQoKI3Bsb3R0aW5nCmxlYXZlb25lb3V0X0VTIDwtIGdncGxvdChNQV9DVlJfRVMpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyLCBsd2QgPSAxKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbW9kX0VTMCRjaS5sYiwgbHR5ID0gMywgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9FUzAkYiwgbHR5ID0gMSwgbHdkID0gMC43NSwgY29sb3VyID0gImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1vZF9FUzAkY2kudWIsIGx0eSA9IDMsIGx3ZCA9IDAuNzUsIGNvbG91ciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHggPSBsZWZ0X291dCwgeSA9IGVzdCwgeW1pbiA9IGxvd2VyLCB5bWF4ID0gdXBwZXIpKSArCiAgeGxhYigiU3R1ZHkgbGVmdCBvdXQiKSArIAogIHlsYWIoImxuUlIsIDk1JSBDSSIpICsgCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSsKICB0aGVtZV9idygpICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSApICsKICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpCgpsZWF2ZW9uZW91dF9FUwoKZGF0JFN0dWR5X0lEIDwtIGFzLmludGVnZXIoZGF0JFN0dWR5X0lEKQpgYGAKKipGaWcuIFM1KiogTGVhdmUtb25lLWdyb3VwLW91dCBhbmFseXNpcyBzaG93aW5nIG1ldGEtYW5hbHl0aWMgbWVhbiBhbmQgOTUlIENJIHdoZW4gZWFjaCBpbmRpdmlkdWFsIHN0dWR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgZGF0YSBzZXQuIAoKIyMjIyBVc2luZyBTTUQKV2UgcmUtcmFuIHRoZSBpbnRlcmFjdGlvbiBvZiBlbnZpcm9ubWVudGFsIGVucmljaG1lbnQgeCBzdHJlc3MgbWV0YS1hbmFseXRpYyBtb2RlbCB1c2luZyBzdGFuZGFyZGlzZWQgbWVhbiBkaWZmZXJlbmNlIChTTUQpIGluc3RlYWQgb2YgbG5SUgoKYGBgIHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KbW9kX0VTMGEgPC0gcm1hLm12KHlpID0gU01EX0VTYSwgViA9IFZDVl9FU2EsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9FUzBhKQppMl9tbChtb2RfRVMwYSkgCgpgYGAKCgojIyMjIFJpc2sgb2YgQmlhcwoKSW5jbHVkaW5nIGlmIHRoZSBzdHVkeSB3YXMgcmFuZG9taXNlZCBhcyBhIG1vZGVyYXRvciBhbmQgY29uZHVjdGluZyBhIHBhaXItd2lzZSBjb250cmFzdAoKYGBgIHtyLCByZXN1bHRzID0gJ2hpZGUnfQptb2RfcmFuZG9taXNlZF9FUzwtIHJtYS5tdih5aSA9IGxuUlJfRVNhLCBWID0gVkNWX0VTLCBtb2QgPSB+Uk9CX3JhbmRvbWlzYXRpb24tMSwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8RVNfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfjF8U3RyYWluKSwKICAgICAgICAgICAgICAgIHRlc3QgPSAidCIsZGF0YSA9IGRhdCkKCnN1bW1hcnkobW9kX3JhbmRvbWlzZWRfRVMpCnIyX21sKG1vZF9yYW5kb21pc2VkX0VTKSAKCmBgYAoKYGBgIHtyfQpjb250cmFfbW9kX3JhbmRvbWlzZWRfRVMgPC0gY29udHJhc3RfZnVuKGRhdGEgPSBkYXQsIHJlc3BvbnNlID0gbG5SUl9FU2EsIG1vZGVyYXRvciA9IFJPQl9yYW5kb21pc2F0aW9uLCBWQ1YgPSBWQ1ZfRVMpCnJlc190YWJsZV9tb2RfcmFuZG9taXNlZF9FUyA8LSBnZXRfZXN0aW1hdGUobW9kZWwgPSBtb2RfcmFuZG9taXNlZF9FUywgY29udHJhID0gY29udHJhX21vZF9yYW5kb21pc2VkX0VTLCBtb2RlcmF0b3IgPSBST0JfcmFuZG9taXNhdGlvbikKCnJlc190YWJsZV9tb2RfcmFuZG9taXNlZF9FUwpgYGAKCkluY2x1ZGluZyBpZiB0aGUgc3R1ZHkgdXNlZCBibGluZGluZyBhbmQgY29uZHVjdGluZyBhIHBhaXItd2lzZSBjb250cmFzdAoKYGBgIHtyLCByZXN1bHRzID0gJ2hpZGUnfQptb2RfYmxpbmRpbmdfRVM8LSBybWEubXYoeWkgPSBsblJSX0VTYSwgViA9IFZDVl9FUywgbW9kID0gflJPQl9ibGluZGluZy0xLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxTdHJhaW4pLAogICAgICAgICAgICAgICAgdGVzdCA9ICJ0IixkYXRhID0gZGF0KQoKc3VtbWFyeShtb2RfYmxpbmRpbmdfRVMpCnIyX21sKG1vZF9ibGluZGluZ19FUykgCgpgYGAKCmBgYCB7cn0KY29udHJhX21vZF9ibGluZGluZ19FUyA8LSBjb250cmFzdF9mdW4oZGF0YSA9IGRhdCwgcmVzcG9uc2UgPSBsblJSX0VTYSwgbW9kZXJhdG9yID0gUk9CX2JsaW5kaW5nLCBWQ1YgPSBWQ1ZfRVMpCnJlc190YWJsZV9tb2RfYmxpbmRpbmdfRVMgPC0gZ2V0X2VzdGltYXRlKG1vZGVsID0gbW9kX2JsaW5kaW5nX0VTLCBjb250cmEgPSBjb250cmFfbW9kX2JsaW5kaW5nX0VTLCBtb2RlcmF0b3IgPSBST0JfYmxpbmRpbmcpCgpyZXNfdGFibGVfbW9kX2JsaW5kaW5nX0VTCmBgYAoKCiMjICdQYWlyd2lzZScgZWZmZWN0IHNpemVzIHsudGFic2V0fQpXZSBjb25kdWN0ZWQgZml2ZSAnbWV0YS1hbmFseXNlcyBvbiAncGFpci13aXNlJyBjb21wYXJpc29ucyB1c2luZyBsblJSIGJldHdlZW4gdGhlIHRyZWF0bWVudHMgYW5kIGNvbnRyb2w6IAokJApcbG57XHRleHR7UlJ9fSA9IFxsbiAoTV97XHRleHR7RUN9fS9NX3tcdGV4dHtDQ319KSwgClxsbiAoTV97XHRleHR7Q1N9fS9NX3tcdGV4dHtDQ319KSwgClxsbiAoTV97XHRleHR7RVN9fS9NX3tcdGV4dHtDQ319KSwgClxsbiAoTV97XHRleHR7RVN9fS9NX3tcdGV4dHtDU319KQpcbG4gKE1fe1x0ZXh0e0VTfX0vTV97XHRleHR7RUN9fSksIAokJAoKIyMjIEVucmljaG1lbnQgcmVsYXRpdmUgdG8gY29udHJvbAoKJCQKXGxue1x0ZXh0e1JSfX0gPSBcbG4gKE1fe1x0ZXh0e0VDfX0vTV97XHRleHR7Q0N9fSkKJCQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9CgpWQ1ZfRTIwIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRsblJSVl9FMiwgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FMjAgPC0gcm1hLm12KHlpID0gbG5SUl9FMmEsIFYgPSBWQ1ZfRTIwLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAxfFN0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lEKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLCAKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0LCAKICAgICAgICAgICAgICAgICBjb250cm9sPWxpc3Qob3B0aW1pemVyPSJvcHRpbSIsIG9wdG1ldGhvZD0iTmVsZGVyLU1lYWQiKSkKCnN1bW1hcnkobW9kX0UyMCkgCmkyX21sKG1vZF9FMjApIAoKb3JjaGFyZF9wbG90KG1vZF9FMjAsIG1vZCA9ICJJbnQiLCB4bGFiID0gImxuUlIiKQpgYGAKCiMjIyBTdHJlc3MgcmVsYXRpdmUgdG8gY29udHJvbAoKJCQKXGxue1x0ZXh0e1JSfX0gPSBcbG4gKE1fe1x0ZXh0e0NTfX0vTV97XHRleHR7Q0N9fSkKJCQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9TMjAgPC0gaW1wdXRlX2NvdmFyaWFuY2VfbWF0cml4KHZpID0gZGF0JGxuUlJWX1MyLCBjbHVzdGVyID0gZGF0JFN0dWR5X0lELCByID0gMC41KQoKbW9kX1MyMCA8LSBybWEubXYoeWkgPSBsblJSX1MyYSwgViA9IFZDVl9TMjAsIHJhbmRvbSA9IGxpc3QofjF8U3R1ZHlfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAxfFN0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lEKSwKICAgICAgICAgICAgICAgICB0ZXN0ID0gInQiLAogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXQpCgpzdW1tYXJ5KG1vZF9TMjApIAppMl9tbChtb2RfUzIwKSAKIApvcmNoYXJkX3Bsb3QobW9kX1MyMCwgbW9kID0gIkludCIsIHhsYWIgPSAibG5SUiIpCmBgYAoKIyMjIEVucmljaG1lbnQgKyBzdHJlc3MgcmVsYXRpdmUgdG8gY29udHJvbAoKJCQKXGxue1x0ZXh0e1JSfX0gPSBcbG4gKE1fe1x0ZXh0e0VTfX0vTV97XHRleHR7Q0N9fSkKJCQKCmBgYCB7ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTd9ClZDVl9FUzIwIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRsblJSVl9FUzIsIGNsdXN0ZXIgPSBkYXQkU3R1ZHlfSUQsIHIgPSAwLjUpCgptb2RfRVMyMCA8LSBybWEubXYoeWkgPSBsblJSX0VTMmEsIFYgPSBWQ1ZfRVMyMCwgcmFuZG9tID0gbGlzdCh+MXxTdHVkeV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4gMXxTdHJhaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+MXxFU19JRCksCiAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICBkYXRhID0gZGF0KQpzdW1tYXJ5KG1vZF9FUzIwKSAKaTJfbWwobW9kX0VTMjApIAoKb3JjaGFyZF9wbG90KG1vZF9FUzIwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIikKYGBgCgojIyMgRW5yaWNobWVudCArIHN0cmVzcyByZWxhdGl2ZSB0byBzdHJlc3MKCiQkClxsbntcdGV4dHtSUn19ID0gXGxuIChNX3tcdGV4dHtFU319L01fe1x0ZXh0e0NTfX0pCiQkCgpgYGAge3IsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03fQpWQ1ZfRTMwIDwtIGltcHV0ZV9jb3ZhcmlhbmNlX21hdHJpeCh2aSA9IGRhdCRsblJSVl9FMywgY2x1c3RlciA9IGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9FMzAgPC0gcm1hLm12KHlpID0gbG5SUl9FM2EsIFYgPSBWQ1ZfRTMwLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAxfFN0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lEKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCkKc3VtbWFyeShtb2RfRTMwKSAKaTJfbWwobW9kX0UzMCkgCgpvcmNoYXJkX3Bsb3QobW9kX0UzMCwgbW9kID0gIkludCIsIHhsYWIgPSAibG5SUiIpCmBgYAoKIyMjIEVucmljaG1lbnQgKyBzdHJlc3MgcmVsYXRpdmUgdG8gZW5yaWNobWVudAokJApcbG57XHRleHR7UlJ9fSA9IFxsbiAoTV97XHRleHR7RVN9fS9NX3tcdGV4dHtFQ319KQokJAoKYGBgIHtyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9N30KVkNWX1MzMCA8LSBpbXB1dGVfY292YXJpYW5jZV9tYXRyaXgodmkgPSBkYXQkbG5SUlZfUzMsIGNsdXN0ZXIgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdCRTdHVkeV9JRCwgciA9IDAuNSkKCm1vZF9TMzAgPC0gcm1hLm12KHlpID0gbG5SUl9TM2EsIFYgPSBWQ1ZfUzMwLCByYW5kb20gPSBsaXN0KH4xfFN0dWR5X0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAxfFN0cmFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4xfEVTX0lEKSwKICAgICAgICAgICAgICAgICAgdGVzdCA9ICJ0IiwKICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdCwKICAgICAgICAgICAgICAgICAgIGNvbnRyb2w9bGlzdChvcHRpbWl6ZXI9Im9wdGltIiwgb3B0bWV0aG9kPSJOZWxkZXItTWVhZCIpKQpzdW1tYXJ5KG1vZF9TMzApIAppMl9tbChtb2RfUzMwKSAKCm9yY2hhcmRfcGxvdChtb2RfUzMwLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIikKYGBgCgojIyBGaWd1cmVzCiMjIyBQYW5lbCBvZiAnZm9jYWwnIEVTIGFuZCAncGFpcndpc2UnIEVTIG9yY2hhcmQgcGxvdHMKVXNlZCB0byBwcm9kdWNlIEZpZy4gMwpgYGAge3J9Cm1vZF9saXN0MSA8LSBsaXN0KG1vZF9FMCwgbW9kX1MwLCBtb2RfRVMwKQoKbW9kX3JlczEgPC0gbGFwcGx5KG1vZF9saXN0MSwgZnVuY3Rpb24oeCkgbW9kX3Jlc3VsdHMoeCwgbW9kID0gIkludCIpKQoKbWVyZ2VkMSA8LSBzdWJtZXJnZShtb2RfcmVzMVtbM11dLCBtb2RfcmVzMVtbMl1dLCAgbW9kX3JlczFbWzFdXSwgbWl4ID0gVCkKbWVyZ2VkMSRtb2RfdGFibGUkbmFtZSA8LSBmYWN0b3IobWVyZ2VkMSRtb2RfdGFibGUkbmFtZSwgbGV2ZWxzID0gYygiSW50cmNwdDEiLCAKICAgICJJbnRyY3B0MiIsICJJbnRyY3B0MyIpLCAKICAgIGxhYmVscyA9IHJldihjKCJFbnJpY2htZW50IE1FIiwgIlN0cmVzcyBNRSIsICJJbnRlcmFjdGlvbiIpKSkKCm1lcmdlZDEkZGF0YSRtb2RlcmF0b3IgPC0gZmFjdG9yKG1lcmdlZDEkZGF0YSRtb2RlcmF0b3IsIGxldmVscyA9IGMoIkludHJjcHQxIiwgCiAgICAiSW50cmNwdDIiLCAiSW50cmNwdDMiKSwgCiAgICBsYWJlbHMgPSByZXYoYygiRW5yaWNobWVudCBNRSIsICJTdHJlc3MgTUUiLCAiSW50ZXJhY3Rpb24iKSkpCgpvcmNoYXJkMTwtIG9yY2hhcmRfcGxvdChtZXJnZWQxLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIiwgYW5nbGUgPSAwKSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMgCiAgeGxpbSgtMiw0LjUpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNCwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiMwMEFFRUYiLCIjMDBBNjUxIiwiI0VEMUMyNCIpKSsgIyBjaGFuZ2UgY29sb3VycwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMDBBRUVGIiwiIzAwQTY1MSIsIiNFRDFDMjQiKSkrCiAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIsIGZpbGw9TkEsIHNpemU9MS4zKSwgIyBib3JkZXIgYXJvdW5kIHRoZSBwbG90CiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAjIGNoYW5nZSBmb250IHNpemVzCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgCgpgYGAKCgpgYGAge3J9Cgptb2RfbGlzdDIgPC0gbGlzdChtb2RfUzMwLCBtb2RfRTMwLCBtb2RfRVMyMCwgbW9kX1MyMCwgbW9kX0UyMCkgI3JlYXJyYW5nZWQgdGhlIG9yZGVyIHNvIHRoYXQgaXQgbWF0Y2hlcyBpbnRleHQgcmVzdWx0cwoKbW9kX3JlczIgPC0gbGFwcGx5KG1vZF9saXN0MiwgZnVuY3Rpb24oeCkgbW9kX3Jlc3VsdHMoeCwgbW9kID0gIkludCIpKQoKbWVyZ2VkMiA8LSBzdWJtZXJnZShtb2RfcmVzMltbMV1dLCBtb2RfcmVzMltbMl1dLCAgbW9kX3JlczJbWzNdXSwgbW9kX3JlczJbWzRdXSwgIG1vZF9yZXMyW1s1XV0sIG1peCA9IFQpCgptZXJnZWQyJG1vZF90YWJsZSRuYW1lIDwtIGZhY3RvcihtZXJnZWQyJG1vZF90YWJsZSRuYW1lLCBsZXZlbHMgPSBjKCJJbnRyY3B0MSIsIAogICAgIkludHJjcHQyIiwgIkludHJjcHQzIiwgIkludHJjcHQ0IiwgIkludHJjcHQ1IiksIAogICAgbGFiZWxzID0gcmV2KGMoIkVDL0NDIiwgIkNTL0NDIiwgIkVTL0NDIiwgIkVTL0NTIiwgIkVTL0VDIikpKQoKbWVyZ2VkMiRkYXRhJG1vZGVyYXRvciA8LSBmYWN0b3IobWVyZ2VkMiRkYXRhJG1vZGVyYXRvciwgbGV2ZWxzID0gYygiSW50cmNwdDEiLCAKICAgICJJbnRyY3B0MiIsICJJbnRyY3B0MyIsICJJbnRyY3B0NCIsICJJbnRyY3B0NSIpLCAKICAgIGxhYmVscyA9IHJldihjKCJFQy9DQyIsICJDUy9DQyIsICJFUy9DQyIsICJFUy9DUyIsICJFUy9FQyIpKSkKCm9yY2hhcmQyIDwtIG9yY2hhcmRfcGxvdChtZXJnZWQyLCBtb2QgPSAiSW50IiwgeGxhYiA9ICJsblJSIiwgYW5nbGUgPSAwKSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbG93ZXJQUiwgeG1heCA9IHVwcGVyUFIpLCBoZWlnaHQgPSAwLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBzaXplID0gMS4xLCBhbHBoYSA9IDAuNSkgKyAjIHByZWRpY3Rpb24gaW50ZXJ2YWxzCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBsb3dlckNMLCB4bWF4ID0gdXBwZXJDTCksIGhlaWdodCA9IDAuMDUsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSAyKSArICMgY29uZmlkZW5jZSBpbnRlcnZhbHMgCiAgeGxpbSgtMiw0LjUpICsKICBnZW9tX3BvaW50KGFlcyhmaWxsID0gbmFtZSksICBzaXplID0gNCwgc2hhcGUgPSAyMSkrICMgbWVhbiBlc3RpbWF0ZQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgNykpKyAjIGNoYW5nZSBwb2ludCBzY2FsaW5nCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjN0I4MUJFIiwiI0Q3REYyMyIsIiNGMzcxNTgiLCIjNzVDQkYyIiwiIzk3RDJCNCIpKSsgIyBjaGFuZ2UgY29sb3VycwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjN0I4MUJFIiwiI0Q3REYyMyIsIiNGMzcxNTgiLCIjNzVDQkYyIiwiIzk3RDJCNCIpKSsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwgZmlsbD1OQSwgc2l6ZT0xLjMpLCAjIGJvcmRlciBhcm91bmQgdGhlIHBsb3QKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICMgY2hhbmdlIGZvbnQgc2l6ZXMKICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCmBgYAoKYGBgIHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9N30KCnAxIDwtIG9yY2hhcmQxICsgb3JjaGFyZDIgKyAgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSAnQScpCnAxCgojc2F2ZWQgYXMgUERGOiA2IHggMTUgaW5jaGVzCmBgYAoqKkZpZy4gMyoqIE9yY2hhcmQgcGxvdHMgc2hvd2luZyB0aGUgZWlnaHQgbWV0YS1hbmFseXRpYyBtb2RlbHMuIChBKSBtYWluIGVmZmVjdHMgb2YgZW5yaWNobWVudCBhbmQgc3RyZXNzLCBhbmQgaW50ZXJhY3Rpb24gb2YgZW52aXJvbm1lbnRhbCBlbnJpY2htZW50IGFuZCBzdHJlc3MsIChCKSDigJhwYWlyd2lzZeKAmSBjb21wYXJpc29ucyBiZXR3ZWVuIHRyZWF0bWVudHMgYW5kIGNvbnRyb2xzLiBUaGljayBibGFjayBsaW5lcyA9IDk1JSBDSSwgdGhpbiBibGFjayBsaW5lcyA9IDk1ICUgUEkuIAoKIyMjIFBhbmVsIG9mIG1ldGEtcmVncmVzc2lvbnMgey50YWJzZXR9CgojIyMjIEVudmlyb25tZW50YWwgZW5yaWNobWVudApVc2VkIHRvIHByb2R1Y2UgRmlnLiA0CmBgYCB7ciwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTd9CiNFbnJpY2htZW50CkVfbW9kIDwtIChMdnNNX0UgKyBMZWFybmluZ19FICsgUmVpbmZvcmNlbWVudF9FKS8gKEFnZV9FICsgRXhlcmNpc2VfRSArIFNvY2lhbF9FKSArICBwbG90X2Fubm90YXRpb24odGFnX2xldmVscyA9ICdBJykKCkVfbW9kCiNzYXZlZCBhcyBwZGYgMTAgeCAxNSBpbmNoZXMKYGBgCioqRmlnLiA0KiogT3JjaGFyZCBwbG90cyBzaG93aW5nIHRoZSBzaXggZGlmZmVyZW50IG1ldGEtcmVncmVzc2lvbnMgb24gdGhlIG1haW4gZWZmZWN0IG9mIGVudmlyb25tZW50YWwgZW5yaWNobWVudCBvbiBsZWFybmluZyBhbmQgbWVtb3J5LiAoQSkgIGxlYXJuaW5nIHZlcnN1cyBtZW1vcnkgcmVzcG9uc2UsIChCKSB0aGUgdHlwZSBvZiBhc3NheSwgKEMpIHRoZSB0eXBlIG9mIHJlaW5mb3JjZW1lbnQsIChEKSB0aGUgYWdlIGF0IGVudmlyb25tZW50YWwgZW5yaWNobWVudCwgKEUpIHR5cGUgb2YgbWFuaXB1bGF0aW9uIG9mIGV4ZXJjaXNlIGR1cmluZyBlbnJpY2htZW50LCAoRikgbWFuaXB1bGF0aW9uIG9mIHRoZSBzb2NpYWwgZW52aXJvbm1lbnQgZHVyaW5nIGVucmljaG1lbnQuICAKCiMjIyMgU3RyZXNzClVzZWQgdG8gcHJvZHVjZSBGaWcuIDUKYGBgIHtyLCAgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTd9ClNfbW9kIDwtIChMdnNNX1MgKyBMZWFybmluZ19TICsgUmVpbmZvcmNlbWVudF9TKSAvIChBZ2VfUyArIFN0cmVzc29yICsgRHVyYXRpb25fUykgKyBwbG90X2Fubm90YXRpb24odGFnX2xldmVscyA9ICdBJykKClNfbW9kCiNzYXZlZCBhcyBwZGYgMTAgeCAxNSBpbmNoZXMKYGBgCioqRmlnLiA1KiogT3JjaGFyZCBwbG90cyBzaG93aW5nIHRoZSBzaXggZGlmZmVyZW50IG1ldGEtcmVncmVzc2lvbnMgb24gdGhlIG1haW4gZWZmZWN0IG9mIHN0cmVzcyBvbiBsZWFybmluZyBhbmQgbWVtb3J5LiAoQSkgbGVhcm5pbmcgdmVyc3VzIG1lbW9yeSByZXNwb25zZSwgKEIpIHRoZSB0eXBlIG9mIGFzc2F5LCAoQykgdGhlIHR5cGUgb2YgcmVpbmZvcmNlbWVudCwgKEQpIHRoZSBhZ2UgYXQgc3RyZXNzLCAoRSkgdGhlIHR5cGUgb2Ygc3RyZXNzb3IgKE1TID0gbWF0ZXJuYWwgc2VwYXJhdGlvbiksIChGKSBjaHJvbmljIG9yIGFjdXRlIHN0cmVzcy4gCgojIyMjIEludGVyYWN0aW9uClVzZWQgdG8gcHJvZHVjZSBGaWcuIDYKYGBgIHtyLCBmaWcud2lkdGg9MTUsIGZpZy5oZWlnaHQ9N30KRVNfbW9kIDwtIHBsb3RfZ3JpZChMdnNNX0VTLCBMZWFybmluZ19FUywgUmVpbmZvcmNlbWVudF9FUywgQWdlX2VucmljaG1lbnRfRVMsIEFnZV9zdHJlc3NfRVMsIE9yZGVyX0VTLCBFeGVyY2lzZV9FUywgU29jaWFsX0VTLCBTdHJlc3Nvcl9FUywgRHVyYXRpb25fRVMsCiAgbGFiZWxzID0gIkFVVE8iLCBuY29sID0gNSkKCkVTX21vZAojc2F2ZWQgYXMgMTAgeCAyNSBpbmNoZXMKYGBgCioqRmlnLiA2KiogT3JjaGFyZCBwbG90cyBzaG93aW5nIHRoZSAxMCBkaWZmZXJlbnQgbWV0YS1yZWdyZXNzaW9ucyBvZiBtb2RlcmF0b3JzIG9uIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGVudmlyb25tZW50YWwgZW5yaWNobWVudCBhbmQgc3RyZXNzIGxlYXJuaW5nIGFuZCBtZW1vcnkuIChBKSBsZWFybmluZyB2ZXJzdXMgbWVtb3J5IHJlc3BvbnNlLCAoQikgdGhlIHR5cGUgb2YgYXNzYXksIChDKSB0aGUgdHlwZSBvZiByZWluZm9yY2VtZW50IHVzZWQsIChEKSB0aGUgYWdlIGF0IGVudmlyb25tZW50YWwgZW5yaWNobWVudCwgKEUpIHRoZSBhZ2UgYXQgc3RyZXNzLCAoRikgdGhlIG9yZGVyIG9mIHRyZWF0bWVudCBleHBvc3VyZSwgKEcpIGlmIGVucmljaG1lbnQgaW52b2x2ZWQgYSBtYW5pcHVsYXRpb24gb2YgZXhlcmNpc2UsIChIKSBtYW5pcHVsYXRpb24gb2YgdGhlIHNvY2lhbCBlbnZpcm9ubWVudCBkdXJpbmcgZW5yaWNobWVudCwgKEkpIHRoZSB0eXBlIG9mIHN0cmVzc29yLCAoRikgc3RyZXNzIHdhcyBjaHJvbmljIG9yIGFjdXRlLiAKCiMjIyBQYW5lbCBvZiBmdW5uZWwgcGxvdHMKVXNlZCB0byBwcm9kdWNlIEZpZy4gNwpgYGAge3IsIGV2YWwgPSBGQUxTRX0KIyBFRQoKcGRmKE5VTEwpCmRldi5jb250cm9sKGRpc3BsYXlsaXN0PSJlbmFibGUiKQpwYXIobWFyPWMoNCw0LDAuMSwwKSkKQSA8LSBmdW5uZWwobW9kX1NmbSwgeGxhYiA9ICJSZXNpZHVhbHMgKGxuUlIpIiwgeWxhYiA9ICJTdGFuZGFyZCBFcnJvciIsCiAgICAgICAgeGxpbSA9IGMoLTIsMiksCiAgICAgICAgeWxpbSA9IGMoMCwxLjA1KSkKQSA8LSByZWNvcmRQbG90KCkKaW52aXNpYmxlKGRldi5vZmYoKSkKCiMgU3RyZXNzCgpwZGYoTlVMTCkKZGV2LmNvbnRyb2woZGlzcGxheWxpc3Q9ImVuYWJsZSIpCnBhcihtYXI9Yyg0LDQsMC4xLDApKQpCIDwtIGZ1bm5lbChtb2RfU2ZtLCB4bGFiID0gIlJlc2lkdWFscyAobG5SUikiLCB5bGFiID0gIlN0YW5kYXJkIEVycm9yIiwKICAgICAgICB4bGltID0gYygtMiwyKSwKICAgICAgICB5bGltID0gYygwLDEuMDUpKQpCIDwtIHJlY29yZFBsb3QoKQppbnZpc2libGUoZGV2Lm9mZigpKQoKIyBJbnRlcmFjdGlvbgpwZGYoTlVMTCkKZGV2LmNvbnRyb2woZGlzcGxheWxpc3Q9ImVuYWJsZSIpCnBhcihtYXI9Yyg0LDQsMC4xLDApKQpDIDwtIGZ1bm5lbChtb2RfRVNmbSwgeGxhYiA9ICJSZXNpZHVhbHMgKGxuUlIpIiwgeWxhYiA9ICJTdGFuZGFyZCBFcnJvciIsCiAgICAgICAgeGxpbSA9IGMoLTIsMiksCiAgICAgICAgeWxpbSA9IGMoMCwxLjA1KSkKQyA8LSByZWNvcmRQbG90KCkKaW52aXNpYmxlKGRldi5vZmYoKSkKCiMgcHV0dGluZyB0b2dldGhlcgpnZ2RyYXcoQSkgKyBnZ2RyYXcoQikgKyBnZ2RyYXcoQykgKyBwbG90X2Fubm90YXRpb24odGFnX2xldmVscyA9ICdBJykKCiNwbmcoZmlsZSA9IGhlcmUoImZpZ3MiLCAiRmlnN19GdW5uZWxzLnBuZyIpKQogCiNkZXYub2ZmKCkKYGBgCgpgYGB7ciwgb3V0LmhlaWdodD0iMTIwJSJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmUoImZpZ3MiLCAiZnVubmVscy5wbmciKSkKYGBgCgoqKkZpZy4gNyoqIEZ1bm5lbCBwbG90cyBvZiB0aGUgc3RhbmRhcmQgZXJyb3IgYW5kIHJlc2lkdWFscyAobG5SUikgZnJvbSB0aGUgZnVsbCBtb2RlbHMuIChBKSBlbnZpcm9ubWVudGFsIGVucmljaG1lbnQgbWFpbiBlZmZlY3QsIChCKSBzdHJlc3MgbWFpbiBlZmZlY3QsIChDKSBlbnZpcm9ubWVudGFsIGVucmljaG1lbnQgeCBzdHJlc3MgaW50ZXJhY3Rpb24uCgojIFNvZnR3YXJlIGFuZCBwYWNrYWdlIHZlcnNpb25zCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKSAlPiUgcGFuZGVyKCkKYGBgCgo=